汇编语言怎么写程序(汇编语言程序设计的一般步骤是什么)

本文目录
- 汇编语言程序设计的一般步骤是什么
- 如何编写最简单的汇编语言
- 汇编语言程序要怎样一步步操作
- 用汇编语言编写一程序
- 汇编语言编写一个简单的程序(我学的是汇编语言与接口技术)
- 用汇编语言编写一个程序
- 用汇编语言编写一完整程序!
- 汇编语言 编写程序
- 用汇编语言编写一个简单程序
汇编语言程序设计的一般步骤是什么
汇编语言程序设计的基本步骤 了解了汇编语言指令的功能和用法,了解了汇编语言程序的编写格式,就可以编制完整的汇编语言程序了。一个程序通常具有顺序、分支、循环和子程序4种结构形式。顺序程序结构就是指完全按顺序逐条执行的指令序列。在程序设计过程中,顺序结构大量存在,屡见不鲜。但一个完整的程序只是逐条去执行指令,这非常少见。常见的程序结构,是上述4种结构的混合体。 一般来说,编制一个汇编语言程序的步骤如下: (1) 分析题意,确定算法或算法思想。 算法是指解决问题的方法和步骤。比如现有的一些计算方法和日常生活中解决问题的逻辑思维推理方法等。 (2) 根据算法画出流程图,简单的情况也可不画。 画出描述算法的流程图,可以首先从图上检验算法的正确性,减少出错的可能,使得动手编写程序时的思路更加清晰。 (3) 分配存储空间和工作单元,合理地使用寄存器。 分配存储空间和工作单元,是指存储空间的分段和数据定义。另外,由于寄存器的数量有限,编写程序时经常会感到寄存器不够用。因此,对于字节数据,要尽量使用8位寄存器。而采用适当的寻址方式,也会达到节省寄存器的目的。 (4) 根据流程图编写程序。 这是编制汇编语言程序最为重要的一步。算法里规定的功能,是要通过一条条指令描述出来的。为了提高编程能力,对于初学者,一是要多阅读现有的程序,以学习别人的编程经验;而更为重要的是,必须多亲自动手编写,不要怕失败,只有通过无数次失败,才能从中积累自己的编程经验。 (5) 上机调试运行程序。 通过汇编的源程序,只能说明它里面不存在语法错误。但是它是否能达到算法所要求的预期效果,还必须经过上机调试,用一些实验数据来测试,才能够真正地得出结论。可以这么说,即使是一个非常有经验的程序员,也没有百分之百的把握说他编写的程序一次就成功。 用流程图表示算法 流程图用一些图形框来代表各种操作。用图形表示算法,直观形象,可以用来帮助人们对算法的理解。下图给出了一些常用的流程图符号。
上图中的判断框(菱形)用来对一个给定的条件作出判断,以决定如何执行其后的操作。它有一个入口,两个出口,如下图(a)所示。
连接点(圆圈)是用来将画在不同地方的流程线连接起来。例如在下图(b)里,有两个圈里写着数字1的圆圈,它表示是从左边的1出来,进到右边图的1里(这由流程线的方向给出)。可以看出,这两个点其实就是同一个点,只是由于画不下而分开来画的。用连接点,可以避免流程图中的流程线相互交叉或过长,从而使流程图清晰。
注释框不是流程图中必需的部分。在流程图中使用它,是为了对流程图中的某些框的操作做一些必要的说明,以便使人们能够更好地通过流程图来理解算法。
处理框反映做些什么样的操作,如把某个单元的内容送入某个寄存器,从某个存储单元取出数据等。它是流程图里最为本质的、出现最多的图形框。
输入/输出框反映程序的输入和输出情况。计算机程序无外乎接收数据,进行处理,然后加以输出,所以输入/输出框是必不可少的。
如何编写最简单的汇编语言
首先明白编译环境:以上4个exe程序必须在32机中运行,若是64位机,请参照dosbox0.74(如何在64位机中使用debug)使用方法。
了解计算机CPU原理:详情请参照“80X86计算机组织”和“80X86的指令系统和寻址方式”
首先有一道题:
求表达式Y=A*X+B-C的值,已知A、B、C分别存放在DA-1、DA-2、DA-3字节单元,它们的值分别是:5 、 6、 7,X存放在INPUT字节单元,结果Y放入JSJ_10字节单元。
分析顺序结构程序代码:由记事本敲出来的
data segment da_1 db 5 da_2 db 6 da_3 db 7 input db 1 jsj_10 db 0data ends ;这一段在内存中定义了一个段,叫做data,并且其中存入了5个变量并且付入初值,db代表每个变量占用1个字节,若是dd则为字,为2个字节code segment ;名字叫做code的段的定义,显然这儿作为代码段,当然code这个名字可以更改 assume cs:code,ds:data ;指定data为DS数据段,code为CS代码段start: mov ax,data ;加法指令 mov ds,ax ;加法指令 mov al,da_1 ;加法指令
mov bl,input ;加法指令
mul bl ;乘法 add al,da_2 sub al,da_3 ;减法 mov jsj_10,al
exit: mov ah,4ch int 21h ;这两行相当于ret(返回值),就像C语言中的return 0;
code ends end start
注释: XXXX segment
.............
XXXX ends ;定义一个段
assume ds:XXXX 把XXXX段指定为ds(ds是段地址寄存器)
请先提前把masm edit debug link文件放入预定的文件夹,并把编写的xxxx.asm代码文件放入该文件夹,asm文件可用记事本写成,并改格式txt为asm(有的看不到文件后缀.txt的请参照百度)
打开cmd,并设置目录进入刚才的文件夹。
现在教如何使用edit我们的asm文件
现在使用masm命令,借助masm.exe宏汇编程序将我们的asm文件翻译成obj二进制代码文件,若是过程中遇到错误,请用edit命令修改asm文件。
以上步骤之后,在文件夹中已经多出了生成的obj文件。此时需要将obj文件连接并生成exe可执行程序
于此,目录中又多出了exe文件。
在接下来这几步中,我们需要使用各种汇编指令进行程序调试。
接下来出现了,一个“-”,键入R查看数据,点击U反汇编,可以查看到将要执行的步骤
接下来便是执行程序,首先设置数据段。通过键入两次T(逐行执行命令)将data segment 设置为数据段。
这里,我们将各个步骤分别讲解
程序调试完毕,在来观察数据段中的值的情况。
汇编语言程序要怎样一步步操作
1 用文本程序写好源代码,另存为.asm文件
2 用编译器(比如masm5.0),输入masm xx.asm(文件名就是你另存的)进行编译(建议 把源程序放在和编译器同一个文件夹下,那样编译的时候不用指定路径)
3 输入link xx.obj连接
4链接完成就可以运行exe程序了
回答者: Sword徐 - 魔法师 四级 10-27 13:09
用汇编语言编写一程序
; 本程序通过编译,运行正确
Code Segment
Assume CS:Code,DS:Code
CR equ 000DH
LF equ 000AH
KBBack equ 0008H
Name_Len equ 18 ;用户名最大长度
Pass_Len equ 8 ;密码最大长度
; -------------------------------------
; 将用户名和密码定义为一个结构类型
User Struc ; 成绩单结构类型
User_Name db Name_Len dup(?) ; 用户名
Name_Lenth db ? ;用户名实际长度
Pass_Word db Name_Len dup(?) ; 密码
Pass_Lenth db ? ;密码实际长度
User EndS
; -------------------------------------
; 功能:显示指定地址(Str_Addr)的字符串
; 入口:
; Str_Addr=字符串地址(要求在数据段)
; 用法: Output Str_Addr
; 用法举例:Output PromptStr
Output MACRO Str_Addr
lea dx,Str_Addr
mov ah,9
int 21h
EndM
; -------------------------------------
; 功能:取光标位置
; 入口:无
; 出口:DH=行号,DL=列号
GetCursor Proc Near
PUSH AX
PUSH BX
PUSH CX
PUSH DX
XOR BX,BX
MOV AH,3
INT 10H
MOV Cursor_Row,DH
MOV Cursor_Col,DL
POP DX
POP CX
POP BX
POP AX
RET
Cursor_Row DB ?
Cursor_Col DB ?
GetCursor EndP
; -------------------------------------
; 功能:置光标位置
; 入口:Cursor_Row=行坐标; Cursor_Col: 列坐标)
SetCursor Proc Near
PUSH DX
PUSH CX
PUSH BX
PUSH AX
MOV DH,Cursor_Row
MOV DL,Cursor_Col
XOR BX,BX
MOV AH,2
INT 10H
POP AX
POP BX
POP CX
POP DX
RET
SetCursor EndP
; -------------------------------------
; 窗口上滚指定行数
Roll_Up Proc Near
xor bh,bh ;显示页号
mov ah,8 ;读光标位置的字符和属性
int 10h
mov bh,ah ;上滚窗口空行属性
mov cx,100h ;左上角坐标
mov al,5
mov dx,54fh ;右下角坐标
mov ah,6
int 10h
ret
Roll_Up EndP
; -------------------------------------
; 功能:输入指定位数的用户密码,实际输入的密码字符以“*”显示,并有回空纠错功能
; 入口:di=密码输入缓冲区地址
; 出口:AL=实际输入的密码字符数
Input_PassW Proc Near
push di
mov cx,Pass_Len ;密码最大长度
@@Input: call GetCursor ;取光标位置
mov ah,7 ;从键盘接受一个字符
int 21h
cmp al,CR ;回车符?
jz @@Calc_Chrs ;是,结束密码输入,转去计算实际输入的密码字符数
cmp al,KBBack
jz @@KB_Back ;若是回空键,重新输入
stosb ;保存输入的字符
mov dl,’*’
mov ah,2
int 21h
jmp @@KBBack
@@KB_Back: dec Cursor_Col
inc cx
dec di
@@KBBack: inc Cursor_Col
call SetCursor ;置光标位置
loop @@Input ;接受下一个数字
@@Calc_Chrs:mov cx,di
pop di
sub cx,di
cmp cl,
jnz @@Pass_Err ;密码长度不等
mov cl,
xor ch,ch
push si
lea si,
cld
repz cmpsb ;比较密码是否正确
pop si
jcxz $+4
@@Pass_Err: clc ;进位标志复位,表示密码不正确
ret
stc ;进位标志置位,表示密码正确
ret
Input_PassW EndP
; -------------------------------------
Again_Input Proc Near
Output Input_Again ;提示:是否重新输入用户名
mov ah,1 ;从键盘接受一个字符
int 21h
or al,20h ;转换成小写,大小写不敏感
cmp al,’y’ ;重新输入?
jnz $+7 ;不
call Roll_Up ;窗口上滚指定行数
stc ;进位标志置位,表示重复前面的操作
ret
cmp al,’n’ ;不重新输入?
jnz Again_Input ;不是,非有效字母,重新输入
clc ;进位标志复位,表示放弃前面的操作
ret
Again_Input EndP
; -------------------------------------
Users equ 5 ;用户数
Even
User_Inform User 《’richcon’,7,’12345678’,8》
User 《’WangMing’,8,’21345678’,8》
User 《’ZhangHongQiao’,13,’13245678’,8》
User 《’LiYan’,5,’12435678’,8》
User 《’XuPengYu’,12,’12354678’,8》
Prompt_User db ’User name: $’
Prompt_Word db ’Pass word: $’
Empty_Error db 7,CR,LF,CR,LF,’User name is empty.$’
Register_No db 7,CR,LF,CR,LF,’No register.$’
Pass_Error db 7,CR,LF,CR,LF,’Pass word error!$’
Welcome db 7,CR,LF,CR,LF,’WELCOME$’,0
Input_Again db CR,LF,CR,LF,’Do you input user name again(y/n)?$’
Start: push cs
pop ds ;使数据段与代码段同段
push cs
pop es ;使附加段与代码段同段
Output Prompt_User ;提示输入用户名
call GetCursor ;取光标位置
Input_Name: call SetCursor ;置光标位置
lea dx,Buffer ;数据缓冲区地址
mov ah,0ah ;键盘缓冲区输入
int 21h
lea si,Buffer ;实际输入的字符数地址
lodsb ;取实际输入的字符数
test al,al ;空串?
jnz Valid_Test ;不是,检测输入的用户是否注册
Output Empty_Error ;提示用户名为空
jmp Input_Name ;重新输入用户名
Valid_Test: mov cx,Users ;注册用户数
lea si,User_Inform ;注册用户信息地址
Valid_Test0:cmp al, ;输入的用户名长度=用户名实际长度?
jnz Next_One ;不相等,与下一个注册用户名比较
push cx
push si
lea si,
lea di,Buffer ;实际输入的用户名地址
mov cl,al
xor ch,ch
cld
repz cmpsb ;比较用户名是否已注册
stc ;进位标志置位,表示用户名已注册
jcxz $+3
clc ;进位标志复位,表示用户名未注册
pop si
pop cx
jc Input_Pass ;用户名已注册,转去输入用户密码
Next_One: add si,type User ;下一个注册用户信息地址
loop Valid_Test0
Output Register_No ;提示:非注册用户
call Again_Input ;是否继续
jc Input_Name ;进位标志置位,转去重新输入用户名
jmp Exit_Proc ;不重新输入用户名,结束程序
Input_Pass: mov word ptr Cursor_Row,1
call SetCursor ;置光标位置
Output Prompt_Word ;提示输入密码
lea di,Buffer ;密码缓冲区地址
call Input_PassW ;输入密码
jc @@Welcome ;密码输入正确,显示欢迎信息
Output Pass_Error ;提示密码输入错误
call Again_Input ;是否继续
jc Input_Pass ;进位标志置位,转去重新输入密码
jmp Exit_Proc ;不重新输入密码,结束程序
@@Welcome: Output Welcome ;显示欢迎信息
Exit_Proc: mov ah,4ch ;结束程序
int 21h
Buffer db 20 ;数据缓冲区
Code ENDS
END Start ;编译到此结束
汇编语言编写一个简单的程序(我学的是汇编语言与接口技术)
;请从键盘任意输入一个0-59内的数,每隔一秒自加一,当加到59后跳到0从新开始自加
DATAS SEGMENT
;此处输入数据段代码
MESS0 DB ’Error char!’,’$’ ;异常信息
MESS1 DB ’Input overflow!’,’$’
MESS2 DB ’Must be 0~59!’,’$’
SEPRA DB 0DH,0AH,’$’ ;分隔符
TIME DB 0
MADDR DW OFFSET MESS0,OFFSET MESS1,OFFSET MESS2 ;异常信息地址
DATAS ENDS
STACKS SEGMENT
;此处输入堆栈段代码
DW 64 DUP (?)
TOP LABEL WORD
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
MAIN PROC FAR
;异常处理
L0:
MOV AH,9
LEA DX,SEPRA
INT 21H
ADD SI,SI
MOV DX,MADDR
INT 21H
LEA DX,SEPRA
INT 21H
INT 21H
XOR BX,BX
JMP SHORT L1 ;重新输入
START:
MOV AX,DATAS
MOV DS,AX
MOV AX,STACKS
MOV SS,AX
LEA SP,TOP
;此处输入代码段代码
MOV BH,10 ;进制数
MOV DI,60 ;模数
XOR BL,BL
L1:
MOV AH,1
INT 21H
CMP AL,’ ’
JE EXIT ;输入空格符,则程序结束
CMP AL,0DH
JE L2 ;输入回车符,则数字输入结束
MOV SI,0
CMP AL,’0’
JB L0
CMP AL,’9’
JA L0
MOV SI,1
AND AL,0FH
XCHG AL,BL
MUL BH
JC L0 ;乘法溢出,数字大于255
ADD BL,AL
JC L0 ;加法溢出,数字大于255
JMP SHORT L1
L2:
MOV SI,2
CMP BL,59
JA L0 ;输入数字大于59
L3:
;取系统时间
MOV AH,2CH
L4: INT 21H
CMP TIME,DH
JE L4
MOV TIME,DH ;如果系统时间更改了,就进行输出
;输出数字
MOV AL,BL
CBW ;AL扩展为AX
CALL SHOWCHAR
;输出分隔符
LEA DX,SEPRA
MOV AH,9
INT 21H
;数字自加1
INC BL
;数字对60取模
MOV AL,BL
CBW
CWD
DIV DI ;(DI)=60
MOV BL,DL
;延时1秒
;CALL DELAY
;判断是否有键盘输入,如果有,则程序结束
MOV AH,6
MOV DL,0FFH
INT 21H
JZ L3
EXIT:
MOV AH,4CH
INT 21H
MAIN ENDP
;传入参数:AL,一个无符号整数;BH,作为全局变量始终为10
;返回参数:无
;功能:显示AX对应的十进制数
SHOWCHAR PROC NEAR
PUSH DX
PUSH CX
XOR CX,CX ;记录十进制位数
L6:
XOR AH,AH
DIV BH
MOV DL,AH
XOR DH,DH
ADD DX,30H
PUSH DX
INC CX
CMP AL,0
JNE L6
MOV AH,2
L7:
POP DX
INT 21H
LOOP L7
POP CX
POP DX
RET
SHOWCHAR ENDP
CODES ENDS
END START
用汇编语言编写一个程序
print MACRO para ;定义一个宏,这样输出字符串的时候,可以省些事儿
lea dx,para
mov ah,9
int 21h
ENDM
data segment
msg1 db ’请用拼音输入姓名学号[格式为:XinMing,XuHao$’
buffer db 50,52 dup(0)’ ;为什么是52?因为你可以输入50个,而系统要用1个字节,在后面放$也需要1个字节
msg2 db ’XinMing,XuHao’
CRLF 0dh,0ah,24h
data ends
code segment
assume cs:code, ds:data
start: mov ax,data
mov ds,ax
print msg1 ;显示“请输入……”
lea dx,buffer
mov ah,0ah
int 21h
lea bx,buffer+2 ;下面几句是利用输入串的长度,来找到该串的尾部,以便填写一个’$’用做显示时的结束。
mov al,
xor ah,ah
add bx,ax
mov al,24h
mov ,al
print CRLF
print msg2
print buffer+2
mov aX,4c00h
int 21h
code ends
end start
由于我这里没有环境,程序没法调试,大致方法如此。
希望可以帮到你。
用汇编语言编写一完整程序!
;江西理工大学
;今天下午刚好咱们上机课,做了这个题,给你完整答案如下:
DATAS SEGMENT
;此处输入数据段代码
BUFF DW 5,25,55,115,138,159,196,163,20,255
DAT DW 0
SHOW DB 4 DUP(0),’$’
DATAS ENDS
STACKS SEGMENT
;此处输入堆栈段代码
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
;此处输入代码段代码
MOV DX,0
MOV AX,0
MOV CX,10;循环次数设置
MOV SI,OFFSET BUFF
lop1:;求和
ADD AX,
ADD SI,2;由于数据是DW的,所以地址每次加2
LOOP lop1
MOV CL,10
DIV CL;求平均,AL存储了平均值,AH存储了余数
;MOV CL,1000
MOV AH,0;分解for显示,求余得到从个位到千位
DIV CL
MOV SHOW+3,AH;
ADD SHOW+3,48
;MOV CL,100
MOV AH,0
DIV CL
MOV SHOW+2,AH;
ADD SHOW+2,48
;MOV CL,10
MOV AH,0
DIV CL
MOV SHOW+1,AH;
ADD SHOW+1,48
MOV SHOW+0,AL;
ADD SHOW+0,48
MOV AH,09H;显示输出
MOV DX,offset SHOW;
INT 21H
MOV AH,4CH
INT 21H
CODES ENDS
END START
汇编语言 编写程序
1.
.model small
.386
.data
.code
just_for_test proc far
mov ax,@data
mov ds,ax
mov ax,1234h
push ax
shr ax,4
mov bl,al
and bl,0fh
shr ax,4
mov cl,al
and cl,0fh
shr ax,4
mov dl,al
and dl,0fh
pop ax
and al,0fh
mov ah,4ch
int 21h
just_for_test endp
end
2.
data segment
Ar dw 0,1,2,3,4,5,6,7,8,9
Br dw 2,4,6,8,10,12,14,16,18,20,22,24,26,28,30
Cr dw 10 dup (?)
data ends
code segment
assume cs:code,ds:data
start:
mov ax, data
mov ds, ax
;-------------------------------
mov si, offset Ar
mov di, offset Cr
mov cx, 10
@C001:
mov ax,
push cx
;-------------------------------
mov bx, offset Br
mov cx, 15
@C002:
mov dx,
cmp ax, dx
jnz @C003
test ax, 1
jnz @C003
mov , ax ; 找到一个在A、B中的偶数
inc di
inc di
@C003:
inc bx
inc bx
loop @C002
;-------------------------------
pop cx
inc si
inc si
loop @C001
;-------------------------------
mov ax,4c00h
int 21h
code ends
end start
自己调去!
用汇编语言编写一个简单程序
1.计算U=(X+(Y*Z-100))/W
其中:X,Y,Z,W均为十六位有符号数。
程序如下:
DATA
SEGMENT
X
DW
10
;16位变量
Y
DW
20
Z
DW
30
W
DW
40
U
DW
?,?
DATA
ENDS
CODE
SEGMENT
ASSUME
CS:CODE,DS:DATA
START:
MOV
AX,DATA
MOV
DS,AX
MOV
AX,Y
IMUL
Z
;计算Y*Z,内容放在DX,AX中
MOV
CX,AX
MOV
BX,DX
SUB
CX,100
;计算Y*Z-100
SBB
BX,
0
MOV
AX,X
CWD
;将X符号扩展,形成DX:AX中的双字
ADD
AX,CX
;计算X+(Y*Z-100),内容放在DX,AX中
ADC
DX,BX
IDIV
W
;计算(X+(Y*Z-100))/W
MOV
U,AX
MOV
U+2,DX
MOV
AH,4CH
INT
21H
CODE
ENDS
END
START

更多文章:
python程序设计叶明全答案(2020-07-15:Python语言程序设计(第1周))
2026年10月15日 14:20
微信小程序设计规范(微信小程序怎么设计 微信小程序设计指南)
2026年10月15日 14:00
counterparts(counterpart什么意思及同义词)
2026年10月15日 13:30
老太太cheapwindowsvps(vps的windows系统怎么搭建ss)
2026年10月15日 09:40
二叉树中序遍历递归算法(建立二叉树,并实现先序中序后序,用递归算法)
2026年10月15日 09:00
java多线程顺序打印abc(在主线程中开启3个子线程,分别实现打印字符串)
2026年10月15日 08:50





