寄存器是独立的,AX的高位AH与低位AL也是独立的
CS:IP组合所指向的地址的内容就是指令
SS:SP指向栈
ret : pop ip
retf : 先 pop ip,再 pop cs
loop指令: cx = cx - 1,然后再判断cx是否等于0
jcxz: cx == 0时,发生跳转
call指令: ip = ip + 所读字节数,push ip,再jmp到标号处 (记录ip,常用ret搭配使用)
call far ptr指令:push cs,push ip (记录地址,常与retf搭配使用)
jmp dword ptr ds:[0]: ip = ds:[0],cs = ds[2]
call dword ptr ds:[0]: push cs,push ip,再 jmp
汇编中指令的执行时的顺序:
1、CPU从CS:IP所指向的内存中读取指令,存到指令缓存器中
2、IP = IP + 指令所读字节数
3、执行指令缓存器中的指令,重复步骤1
汇编语言编写程序时要思考的问题:
数据从哪里来,怎么处理数据(需要考虑数据的长度),数据存到哪里去。
二进制数 0100 0000(128) 的负数:取反+1, -128 = 1100 0000
第11章 标志位寄存器
CF:与运算指令相关,标志进位,CY = Carry Yes(进位) NC = Not Carry(未进位)
ZF:Zero Flag ZR = ZeRo NZ = Not Zero (mul 与 div 不影响此标志位)
PF: Parity Flag 奇偶标志位,PO = Parity Odd = 0(二进制数的1的个位为奇数),
PE = Parity Even = 1(1的个数为偶数)
SF: Sign Flag ,符号标志位 PL = Plus (正) NG = Negtive(负数)
用来标志计算结果的正负 (mul不影响SF)
OF Overflow Flag, 溢出位标识 OV = Overflow = 1(溢出) NV = Not Overflow = 0 (没有溢出),
判断溢出时,寄存器中的数看做无符号的
标志 值为1的标志 值为0的标志
OF OV NV
SF NG PL
ZF ZR NZ
PF PE PO
CF CY NC
DF DN UP
cld指令: 令cf = 0, 与 rep movsb配合每复制一次,si,di自增1
std指令: 令重复= 1,rep movsb配合每复制一次,si,di自减1
adc指令: adc ax,bx <==> ax = ax + bx + CF
sbb指令: sbb ax,bx <==> ax = ax - bx - CF
mul指令: 若是8 bit乘法,一个默认放AL,一个放8位寄存器或内存单元,结果放AX中
; 若是16 bit乘法,一个默认放AX,一个放16位的寄存器或内存单元中,结果低位放AX中,高位放DX中
div指令: 除数:8位或者16位,存一个reg或内存单元中
被除数:存AX 或 AX和DX中(被除数32位时,AX存低位,DX存高位)
je 等于转移
jne 不等于转移 not equal
jb 低于转移
jnb 不低于转移 not below
ja 高于转移
jna 不高于转移 not above
DF标志:
cld:令cf = 0 ,每次操作后 si,di递增
std:令cf = 1,每次操作后si,di递减
rep movsb :重复复制字节数据,重复次数为CX ,会将ds:[si]所指向的数据复制到es:[di]所指向的
地址,每次复制后根据CF的值向前或者向后复制。可参照的小程序。
pushf: 将标志寄存器压入栈中
popf: 从栈中弹出数据,送到标志寄存器中去
CS:IP组合所指向的地址的内容就是指令
SS:SP指向栈
ret : pop ip
retf : 先 pop ip,再 pop cs
loop指令: cx = cx - 1,然后再判断cx是否等于0
jcxz: cx == 0时,发生跳转
call指令: ip = ip + 所读字节数,push ip,再jmp到标号处 (记录ip,常用ret搭配使用)
call far ptr指令:push cs,push ip (记录地址,常与retf搭配使用)
jmp dword ptr ds:[0]: ip = ds:[0],cs = ds[2]
call dword ptr ds:[0]: push cs,push ip,再 jmp
汇编中指令的执行时的顺序:
1、CPU从CS:IP所指向的内存中读取指令,存到指令缓存器中
2、IP = IP + 指令所读字节数
3、执行指令缓存器中的指令,重复步骤1
汇编语言编写程序时要思考的问题:
数据从哪里来,怎么处理数据(需要考虑数据的长度),数据存到哪里去。
二进制数 0100 0000(128) 的负数:取反+1, -128 = 1100 0000
第11章 标志位寄存器
CF:与运算指令相关,标志进位,CY = Carry Yes(进位) NC = Not Carry(未进位)
ZF:Zero Flag ZR = ZeRo NZ = Not Zero (mul 与 div 不影响此标志位)
PF: Parity Flag 奇偶标志位,PO = Parity Odd = 0(二进制数的1的个位为奇数),
PE = Parity Even = 1(1的个数为偶数)
SF: Sign Flag ,符号标志位 PL = Plus (正) NG = Negtive(负数)
用来标志计算结果的正负 (mul不影响SF)
OF Overflow Flag, 溢出位标识 OV = Overflow = 1(溢出) NV = Not Overflow = 0 (没有溢出),
判断溢出时,寄存器中的数看做无符号的
标志 值为1的标志 值为0的标志
OF OV NV
SF NG PL
ZF ZR NZ
PF PE PO
CF CY NC
DF DN UP
cld指令: 令cf = 0, 与 rep movsb配合每复制一次,si,di自增1
std指令: 令重复= 1,rep movsb配合每复制一次,si,di自减1
adc指令: adc ax,bx <==> ax = ax + bx + CF
sbb指令: sbb ax,bx <==> ax = ax - bx - CF
mul指令: 若是8 bit乘法,一个默认放AL,一个放8位寄存器或内存单元,结果放AX中
; 若是16 bit乘法,一个默认放AX,一个放16位的寄存器或内存单元中,结果低位放AX中,高位放DX中
div指令: 除数:8位或者16位,存一个reg或内存单元中
被除数:存AX 或 AX和DX中(被除数32位时,AX存低位,DX存高位)
结果:除数8位时,AL存商,AH存余数;除数16位时,AX存商,DX存余数
je 等于转移
jne 不等于转移 not equal
jb 低于转移
jnb 不低于转移 not below
ja 高于转移
jna 不高于转移 not above
DF标志:
cld:令cf = 0 ,每次操作后 si,di递增
std:令cf = 1,每次操作后si,di递减
rep movsb :重复复制字节数据,重复次数为CX ,会将ds:[si]所指向的数据复制到es:[di]所指向的
地址,每次复制后根据CF的值向前或者向后复制。可参照的小程序。
pushf: 将标志寄存器压入栈中
popf: 从栈中弹出数据,送到标志寄存器中去