本文为学习书籍《汇编语言(第4版)》后的小结。
1、寄存器
序号 | 寄存器 | 描述 |
1 | ax | 运算寄存器 |
2 | bx | 地址寄存器,偏移地址 |
3 | cx | 计数寄存器,loop的结束条件,jcxz的跳转条件 |
4 | dx | 运算寄存器 |
5 | cs | 段地址,指令执行段地址 |
6 | ss | 段地址,栈的段地址 |
7 | ds | 段地址,数据的段地址 |
8 | es | 段地址,extra,扩展的段地址寄存器 |
9 | ip | 偏移地址,instruction,指令偏移地址 |
10 | sp | 偏移地址,stack pointer,栈偏移地址 |
11 | si | 偏移地址,source,源 |
12 | di | 偏移地址,destination,目的 |
13 | bp | 偏移地址,base pointer,基地址 |
14 | 标记寄存器 | 位代表标记,见标记位列表 |
2、指令
指令 类型 | 指令 | 说明 |
运 算 | add、adc | 加法,adc为带进位的加法 |
sub、sbb | 减法,sbb为带进位的减法 | |
mul | 乘法: 结果16位,存放在ax中; 结果32位,高位放在dx中,低位放在ax中。 | |
div | 除法: 8位除法:被除数16位,放在ax中,结果al中存商,ah中存余数; 16位除法:被除数32位,dx存高16位,ax存低16位,结果ax存商,dx存余数 | |
and | and al,00111011B | |
or | or al,00111011B | |
shl和shr | 逻辑左移与右移, 用0补位 | |
inc | 自增1 | |
dec | 自减1 | |
数 据 传 送 | mov | |
movsb | rep movsb 循环(cx)个字符的传送。 df=1(std),si和di自减 | |
movsw | movsw 一个拷贝1个字(两个字节,32位),每次完成si和di +2或-2 | |
rep | 与movsb或movsw搭配使用 | |
push、pop | ||
pushf、popf | push flag、pop flag | |
dup | db 16 dup (0) 将此块内容设置为16个为0的字节 dw 16 dup (0) .....16个为0的字(2个字节) dd 16 dup (0) .....16个为0的双字(4个字节) | |
转 移 指 令 | jmp | |
jcxz | cx==zero跳转 | |
je、jb、ja、 jnb、jna、jne | 与cmp搭配 | |
loop | cx==0结束循环 | |
call与ret | ip寄存器会push和pop | |
int中断 与 iret | int: (1)取中断类型码n; (2)标志寄存器入栈; (3)IF=0,TF=0; (4)CS入栈,IP入栈; (5)修改CS和IP至n号中断码对应的地址 iret: (1)pop IP (2)pop CS (3)popf | |
处 理 控 制 | cld、std | 与movsb或movsw搭配使用: cld,将df设置为0,则si和di自增(或+2); std,将df设置为1,则si和di自减(或-2); |
cli、sti | sti,设置IF=1,在中断处理程序中可处理可屏蔽中断; cli,设置IF=0,在进入中断处理程序后,进制其他的可屏蔽中断。 | |
nop | 占位,和offset搭配,通常用来计算某段代码的长度 |