汇编语言学习笔记(可持续补充)

寄存器是独立的,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存高位)

 结果:除数8位时,AL存商,AH存余数;除数16位时,AX存商,DX存余数


cmp指令:会改变标志位的值,通过标志位可看出比较结果 (cmp 1,2 ,CF标志位变为CY)

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:   从栈中弹出数据,送到标志寄存器中去

你可能感兴趣的:(汇编语言装X之路)