詹 剑 峰 汇 编 语 言 总 结
1.1.1.1. 典型的汇编编写规范................................................................................................................... 1
1.11.11.11.1文字说明...............................................................................................................................1
1.21.21.21.2例题示范...............................................................................................................................1
2.2.2.2. 寄存器及寻址方式.....................................................................................................................2
2.12.12.12.1寄存器说明...........................................................................................................................2
2.22.22.22.2寻址方式说明.......................................................................................................................2
3.3.3.3. 循环与转移指令.........................................................................................................................3
3.13.13.13.1循环文字说明.......................................................................................................................3
3.23.23.23.2循环例题说明.......................................................................................................................3
3.33.33.33.3 跳转指令..............................................................................................................................4
3.43.43.43.4标志寄存器...........................................................................................................................4
3.53.53.53.5条件转移...............................................................................................................................4
3.63.63.63.6例题示范...............................................................................................................................4
4.4.4.4. 子程序调用规范.........................................................................................................................5
4.14.14.14.1子程序编写规范...................................................................................................................5
4.24.24.24.2例题示范...............................................................................................................................5
5.5.5.5. 中断处理.....................................................................................................................................6
5.15.15.15.1中断处理说明.......................................................................................................................7
5.25.25.25.2中断例题...............................................................................................................................7
1.1.1.1. 典型的汇编编写规范
1.11.11.11.1文字说明
包含段声明,段定义,代码段包含功能段
1.21.21.21.2例题示范
Assem CS:code DS:data SS:stack
date segment
DB 1,2,3
DW 10 dup (0)
DD 5 dup (‘a’)
date ends
stact segment
dw 8 dup (0)
stact ends
code segment
start: mov ax,data
mov DS,ax
mov ax,stact
mov SS,ax
mov IP,16h
…………………….
mov ax,4c00h
int 21h
code ends
end start
詹 剑 峰 汇 编 语 言 总 结
2.2.2.2. 寄存器及寻址方式
2.12.12.12.1寄存器说明
si,di,dx,bp:si,di,dx,bp:si,di,dx,bp:si,di,dx,bp:si,di不能分解成两个 8位寄存器使用,同时 si,di不能同时使用,一样 dx,bp
也不能同时使用[di][si] 及[dx][bp]是错误的
达式,[bx]默认是 ds 的偏移量,而[bp]默认是ss
的偏移量,可明确标出 es:[bx] ds:[bp].
2.22.22.22.2寻址方式说明
2.2.1立即寻址方式
立即数可以是 8位、16位或 32位,该数值紧跟在操作码之后。如果立即数为 16位或 32
位,那么,它将按“高高低低”的原则进行存储。例如:
MOV AH, 80H ADD AX, 1234H MOV ECX, 123456H
MOV B1, 12H MOV W1, 3456H ADD D1, 32123456H
2.2.22.2.22.2.22.2.2寄存器寻址方式
指令所要的操作数已存储在某寄存器中,或把目标操作数存入寄存器。把在指令中指
出所使用寄存器(即:寄存器的助忆符)的寻址方式称为寄存器寻址方式。
1、源操作数是寄存器寻址方式
如:ADD VARD, EAX ADD VARW, AX MOV VARB, BH 等。
其中:VARD、VARW和 VARB是双字,字和字节类型的内存变量。在第 4 章将会学到如何
定义它们。
2、目的操作数是寄存器寻址方式
如:ADD BH, 78h ADD AX, 1234h MOV EBX, 12345678H 等。
寄存器的分类 寄存器 主 要 用 途
通
用
寄
存
器
数据
寄存器
AX 乘、除运算,字的输入输出,中间结果的缓存
AL 字节的乘、除运算,字节的输入输出,十进制算术运算
AH 字节的乘、除运算,存放中断的功能号
BX 存储器指针
CX 串操作、循环控制的计数器
CL 移位操作的计数器
DX 字的乘、除运算,间接的输入输出
变址
寄存器
SI 存储器指针、串指令中的源操作数指针
DI 存储器指针、串指令中的目的操作数指针
变址
寄存器
BP 存储器指针、存取堆栈的指针
SP 堆栈的栈顶指针
指令指针 IP/EIP
标志位寄存器 Flag/EFlag
32 位
CPU
的
段寄
存器
16 位 CPU
的
段寄存器
ES 附加段寄存器
CS 代码段寄存器
SS 堆栈段寄存器
DS 数据段寄存器
新增加的
段寄存器
FS 附加段寄存器
GS 附加段寄存器
詹 剑 峰 汇 编 语 言 总 结
3、源和目的操作数都是寄存器寻址方式
如:MOV EAX, EBX MOV AX, BX MOV DH, BL 等。
2.2.32.2.32.2.32.2.3直接寻址方式
指令所要的操作数存放在内存中,在指令中直接给出该操作数的有效地址,这种寻址方
式为直接寻址方式。
MOV AX, 1234H MOV AX, [1234H]
前者是立即寻址,后者是直接寻址
MOV AX, VARW MOV AX, [VARW]
两者是等效的,均为直接寻址
2.2.4寄存器间接寻址方式
操作数在存储器中,操作数的有效地址用SI、DI、BX 和 BP 等四个寄存器之一来指定,
称这种寻址方式为寄存器间接寻址方式。
2.2.52.2.52.2.52.2.5寄存器相对寻址方式
操作数在存储器中,其有效地址是一个基址寄存器(BX、BP)或变址寄存器(SI、DI)的内
容和指令中的 8位/16位偏移量之和。
2.2.62.2.62.2.62.2.6基址加变址寻址方式
操作数在存储器中,其有效地址是一个基址寄存器(BX、BP)和一个变址寄存器(SI、DI)
的内容之和。
2.2.72.2.72.2.72.2.7相对基址加变址寻址方式
操作数在存储器中,其有效地址是一个基址寄存器(BX、BP)的值、一个变址寄存器(SI、
DI)的值和指令中的 8位/16 位偏移量之和。
3.3.3.3. 循环与转移指令
3.13.13.13.1循环文字说明
looplooplooploop:指令循环,其实是个由 CX 存放循环次数, 并跳转的指令,每执行一次,CX-1,
并判断是否 CX==0?,等于 0循环结束,否则继续。
3.23.23.23.2循环例题说明
二重循环的处理:对第一重 CX 一定要暂存典型结构:
s0: PUSH CX //第一重循环计数入栈
MOV CX,4 //设第二重循环 CX 计数
MOV SI,0
s: …………………… //第二重循环内容
LOOP s //第二重循环
…………………… //第一重循环内容
POP CX //第一重循环计数出栈
LOOP s0 //第一重循环
3.33.33.33.3 .... 跳转指令
jmp:,此指令有多形式与变种,用于实现不同范围的或不同条件的跳
转,或依靠 IP进行跳转,或依靠 IP+CS 跳转
jmp short 标号:段内短转移,对 IP的修改范围是-128~127。机器码中不需要转移
源操作数 指令的变形 源操作数的寻址方式
只有偏移量 MOV AX, [100H] 直接寻址方式
只有一个寄存器 MOV AX, [BX] 或 MOV AX, [SI] 寄存器间接寻址方式
有一个寄存器和偏移量 MOV AX, [BX+100H] 或 MOV AX, [SI+100H] 寄存器相对寻址方式
有二个寄存器 MOV AX, [BX+SI] 基址加变址寻址方式
有二个寄存器和偏移量 MOV AX, [BX+SI+100H] 相对基址加变址寻址方式
詹 剑 峰 汇 编 语 言 总 结
目的地址。
Jmp far ptr 标号:段间转移或远转移,机器码中包含 CS 和 IP。
Jmp reg:( IP)=(16位 reg)
Jum word ptr 内存单元地址(段内转移)地址字内容赋给 IP [BX]
Jcxz 标号:等值于 if((cx)==0) jmp short 标号;
Loop 标号:等值于 (cx)--; if((cx)!=0) jmp short 标号;
3.43.43.43.4标志寄存器
有 16位,所存储的信息通常称为程序状态字。
ZF: 零标志位,记录之前的结果是否为零,为零置 1
PF:奇偶标志位,记录当前结果含有 1 的数目,为偶数置 1,奇数置 0
CF:进位(借位)标志位,产生进位置 1,没产生置 0,对无符号数运算
SF:符号标志位,为负置 1,为正置 0,仅对有符号数有意义
OF:溢出标志位,产生溢出置 1,无溢出置 0,只对有符号数运算而言
DF:方向标志位,为 0,si++,di++;为 1,si--,di--。
TF: =0 用于避免单步执行进入死循环
IF:可屏蔽中断(IF=0,不响应可屏蔽中断,中断处理时通过设置 IF=0 用于禁止其他可
屏蔽中断),不可屏蔽中断(中断类型码固定为 2),
3.53.53.53.5条件转移
根据无符号数进行条件转移。
jejejeje 相等转移(equal) ZF=1
jnejnejnejne 不等转移 ZF=0
jbjbjbjb 小于转移(below) CF=1
jnbjnbjnbjnb 不小于转移 CF=0
jajajaja 大于转移(above) CF=0 且 ZF=0
jnajnajnajna 不大于转移 CF=1 或 ZF=1
3.63.63.63.6例题示范
assume cs:codesg
datasg segment
db "Beginner's All-purpose Symbolic Instruction Code.",0
datasg ends
codesg segment
begin:
mov ax,datasg
mov ds,ax
mov si,0
call letterc
mov ax,4c00h
int 21h
letterc: ;子程序部分[开始]
push si
s0: mov al,[si]
cmp al,0
詹 剑 峰 汇 编 语 言 总 结
je exitsub
cmp al,61h ;61h 为'a'的 ASCII 码
jb next
cmp al,7ah ;7ah 为'z'的 ASCII 码
ja next
and al,11011111B ;或使用 sub al,20h
mov [si],al
next: inc si
jmp short s0
exitsub:
pop si
ret ;子程序部分[结束]
codesg ends
end begin
4.4.4.4. 子程序调用规范
4.14.14.14.1子程序编写规范
4.1.14.1.14.1.14.1.1 callcallcallcall:与 retretretret相对应
Call 标号= push IP � jmp near ptr 标号
Call far ptr 标号= push CS�push IP�jmp far ptr 标号
Call reg = push IP�jmp reg
Call dword ptr 内存单元= push CS�push IP�jmp dword ptr 内存单元
4.1.24.1.24.1.24.1.2 retretretret和 retfretfretfretf
用栈中的数据修改 IP或 IP&CS,用于返回。
ret= (IP)=((ss)*16+(sp)) � (sp)=(sp)+2
retf= (IP)=((ss)*16+(sp)) � (sp)=(sp)+2
� (CS)=((ss)*16+(sp)) � (sp)=(sp)+2
4.24.24.24.2例题示范
callcallcallcall与 retretretret的配合使用:典型的子程序调用
data segment
db 'Welcome to masm!',0
data ends
code segment
assume cs:code,ds:data
start:
mov dh,1 ;dh 装行号(范围:1--25)
mov dl,1 ;dl 装列号(范围:1--80)[注:每超过80 等于行号自动加
1]
mov cl,0cah ;cl 中存放颜色属性(0cah为红底高亮闪烁绿色属性)
mov ax,data
mov ds,ax
mov si,0
call show_str
詹 剑 峰 汇 编 语 言 总 结
mov ax,4c00h
int 21h
show_str: ;显示字符串的子程序[定义开始]
push cx
push si
mov al,0A0h
dec dh ;行号在显存中下标从 0开始,所以减 1
mul dh
mov bx,ax
mov al,2
mul dl
sub ax,2 ;列号在显存中下标从 0开始,又因为偶字节存放字符,所以减 2
add bx,ax ;此时 bx中存放的是行与列号的偏移地址
mov ax,0B800h
mov es,ax ;es 中存放的是显存的第0 页(共 0--7 页)的起始的段地址
mov di,0
mov al,cl
mov ch,0
s: mov cl,ds:[si]
jcxz ok
mov es:[bx+di],cl ;偶地址存放字符
mov es:[bx+di+1],al ;奇地址存放字符的颜色属性
inc si
add di,2
jmp short s
ok: pop si
pop cx
ret ;显示字符串的子程序[定义结束]
code ends
end start
5.5.5.5. 中断处理
5.15.15.15.1中断处理说明
1.1.1.1.中断:CPU 不再接着向下执行,而转去处理中断信息,所谓中断信息就是由 CPU 内
部产生或有外部传送的,可立即对接收的信息进行处理。
2.2.2.2.内外中断:CPU 为界,cpu内部产生,和 cpu外部传送的中断,先分析内部中断,
内中断的四种情形:除法错误,单步执行,执行 into 指令,执行 int 指令。
3.3.3.3.中断类型码:用于标识中断信息的来源。为一个字节数据,即 256中编码,内部中断
典型的类型码,除法指令:0,单步执行:1,执行 into:4,执行 int指令,该指令格式为 int n,n
为提供给 CPU中断类型码。
4.4.4.4.中断向量表:8 位中断类型码,通过中断向量表找到相应中断处理程序的入口地址,
用于中断类型嘛与中断处理程序的入口地址一一对应,相应成表。表项占两个字,高地址字
存放段地址,低地址存放偏移地址。从 0000:0000 开始存放。
5.5.5.5.中断处理过程:
(1) 取得中断类型码 N;
詹 剑 峰 汇 编 语 言 总 结
(2) Pushf 标志寄存器的值入栈
(3) TF=0,IF=0 用于避免单步执行进入死循环
(4) Push CS
(5) Push IP
(6) (IP)=(N*4),(CS)=(N*4+2) 读取入口地址,设置 IP,CS
6.6.6.6.中断处理程序:
(1)保存用到的寄存器
(2)处理中断
(3)恢复用到的寄存器
(4)用 iret指令返回(功能等价: pop IP pop CS popf)
7.int7.int7.int7.int指令
其格式 int N, N 是中断类型码,用于引发相应的中断程序
�取中断类型码�pushf,IF=0,TF=0�push CS,push IP�(IP)=(N*4),(CS)=(N*4+2)
8.8.8.8.中断例程
系统存在一些子程序,其以中断处理程序的方式提供给应用程序调
用,在我们编程时可使用 int来调用这些程序,称为中断例程调用。
9.9.9.9.中断例程编写:
�编写实现功能的程序 mul:。。。。。。。。。。。。。。。。。。。。。。。。 mulend:nop
�安装程序(movsb),可安装到 0:200处
�设置中断向量表,mov word ptr es:[n*4],200h mov word ptr es:[n*4+2],0
Int指令与 iret就像 call 与 ret 配合使用
5.25.25.25.2中断例题
实验 12 编写 0 号中断的处理程序(第 240页)
-------------------------------------
完整程序如下:
assume cs:code
code segment
start:
mov ax,cs
mov ds,ax
mov si,offset do0 ;设置 ds:si 指向源地址
mov ax,0
mov es,ax
mov di,200h ;设置 es:di 指向源地址
mov cx,offset do0end - offset do0 ;设置 cx 为传输长度
cld ;设置传输方向为正
rep movsb
;mov ax,0
;mov es,ax
mov word ptr es:[0*4],200h ;设置中断向量的入口地址的偏移地址
mov word ptr es:[0*4+2],0 ;设置中断向量的入口地址的段地址
mov ax,0f000h
mov dx,22d
mov cx,10d
詹 剑 峰 汇 编 语 言 总 结
div cx ;此 4 句是为了做个溢出的除法
mov ax,4c00h
int 21h
do0: jmp short do0start
db "divide error!"
do0start:
mov ax,cs
mov ds,ax
mov si,202h ;设置 ds:si 指向字符串
mov ax,0B800h
mov es,ax
mov di,12*0A0h+2*32 ;设置 es:di 指向显存空间的中间位置
mov cx,13d ;设置字符串长度
s: mov al,[si]
mov es:[di],al
inc si
add di,2
loop s
mov ax,4c00h
int 21h
do0end: nop
code ends
end start