寄存器、指令、操作符
数据处理
两类寄存器
寄存器(reg):ax bx cx dx ah al bh bl ch cl dh dl sp bp si di
段寄存器(sreg):ds ss cs es
bx si di bp
他们可以通过[ ]表示数据。
他们可以单独出现或以 bx si,bx di,bp si,bp di这四种组合出现。
bx默认的段地址是ds。
bp默认的段地址是ss。
数据长度
在有寄存器名字时,看寄存器名字。
在没有寄存起名字时 用word ptr表示字(16位)单元,用byte ptr表示字节(8位)单元。
push pop只进行字操作。
div除法指令
除数:8位或16位,放在reg或内存单元中。
被除数:除数8位则被除数16位,在ax中存放。除数16位则被除数32位,在ax和dx中存放,dx存放高16位,ax存放低16位。
结果:除数为8位,al存商,ah存余数。除数16位,ax存商,dx存余数。
格式:div 除数
伪指令dd
dd命令:定义双字节数据。
dd 1
dup操作符
db/dw/dd 重复次数 dup (重复的数据)
转移指令
offset操作符
获取编译器处理符号的偏移地址。
jmp指令
目的地址在指令中
段内短转移:-128~127字节
jmp short 标号
段内近转移:-32768~32767
jmp near ptr 标号
段间转移,远转移
jmp far ptr 标号
目的地址在寄存器中
jmp reg
目的地址在数据中
jmp word ptr 数据地址(只取一个字,改变ip)
jmp dword ptr 数据地址(取两个字,高地址是cs,低地址是ip)
jcxz指令
有条件的转移指令,属于段内短转移
格式:jcxz 标号
在cx是0的前提条件下才会执行这条指令
loop指令
循环指令是段内短转移。
CALL 和 RET
ret 和 retf
ret:修改ip的内容,实现近转移
格式:ret
效果:
pop ip
retf:修改cs 和 ip 的内容,实现段转移
格式:retf
效果:
pop ip
pop cs
call指令
目的地址在指令中
段内近转移
格式:call 标号
效果:
push ip
jmp near ptr 标号
段间转移
格式:call far ptr 标号
效果:
push cs
push ip
jmp far ptr 标号
目的地址在寄存器中
格式:call 16位reg
效果:
push ip
jmp 16位reg
目的地址在寄存器中
call word ptr 内存单元地址
效果:
push ip
jmp word ptr 内存单元地址
call dword ptr 内存单元地址
效果:
push ip
jmp dword ptr 内存单元地址
mul乘法指令
相乘的数为8位或16位
如果是8位,就放在 al 和 8位reg或内存字节单元中,结果放在ax中
如果是16位,就放在 ax 和 16位reg或内存字单元中,结果高位在dx中,低位在ax中。
格式:mul reg/内存单元
标志寄存器
他就是flag,他储存的信息被称为程序状态字(PSW)。
标志
ZF标志:零标志位,记录相关指令执行后结果是否为零,结果是零zf=1,不是零zf=0
PF标志:奇偶标志位,记录相关指令执行后结果中1的个数是否为偶数,1的个数为偶数pf=1,为奇数pf=0
SF标志:符号标志位,记录相关指令执行后结果是否为负,结果为负sf=1,非负sf=0
CF标志:进位标志位,(无符号数运算)记录运算结果的最高有效位向更高位的进位值,或借位值。
OF标志:溢出标志位,记录(有符号数)运算的结果是否发生溢出,如果发生溢出of=1,没有溢出of=0
指令
adc指令
带进位加法指令,利用cf位。
格式:adc 操作对象1,操作对象2
功能:操作对象1=操作对象1+操作对象2+cf
sbb指令
带借位减法指令,利用cf位
格式:sbb 操作对象1,操作对象2
功能:操作对象1=操作对象1-操作对象2-cf
cmp指令
比较指令
格式:cmp 操作对象1,操作对象2
功能:计算操作对象1-操作对象2 不保存结果
通过标志来判断比较结果
条件转移指令
格式:指令 标号
指令 条件
je : zf=1
jne:zf=0
jb : cf=1
jnb:cf=0
ja : cf=0 且 zf=0
jna:cf=1 或 zf=1
DF标志和串传送指令
DF标志:方向标志位,在串处理指令中,控制si,di增减。df=0 每次操作后si di递增,df=1 每次操作后si di递减
串传送指令
movsb:传送字节
格式:movsb
功能:将ds:si指向的内存单元的字节送入es:di中,然后根据df的值,将si di递增或递减。
movsw:传送字
格式:movsw
功能:将ds:si指向的内存单元的字节送入es:di中,然后根据df的值,将si di递增2或递减2。
几条指令
rep指令:循环指令
格式:rep …
功能:循环执行后面的指令,循环次数取决于cx
cld指令:df=0
std指令:df=1
pushf 和 popf
pushf:将标志存储器数据压栈。
popf:将栈中数据存入标志存储器。