《深入理解计算机系统》汇编部分
涉及的一些概念
DISP/16位:AX(累加器),BX(基址寄存器),CX(计数器),DX(数据与地址寄存器),SP(堆栈指针),BP(基址指针),SI(源变址器),DI(目的变址器)
DISP/8位:AH(高8位),AL(低8位),BH,BL,CH,CL.DH,DL
IP指令指针,存放代码段中的偏移地址;EA偏移地址,段内相对地址,有效地址
CS代码段,SS堆栈段,DS数据段,ES附加段
堆栈:方便事项程序要求保留和恢复有关信息的特殊存储部件,是一种数据结构。
pws(状态):CF(进位),PF(奇偶),SF(符号),OF(溢出),ZF(零),DF(方向),IF(中断),TF(跟踪)
PA:20位物理地址 ;MOV传送
A,d,c寄存器为调用者寄存器,子进程随便用,B,s,d为被调用者寄存器,用于返回现场。
一、寻址方式
1、立即寻址
用来表示常数
MOV AX,1946H;1946H(立即数)-->AX
2、寄存器寻址
MOV AX,CX ;cx-->ax
3、直接寻址
MOV BX,[1000H] ;[1000H]→EA,操作数默认DS
MOV AX,ES:VAR ;越段前缀
4、寄存器间接寻址
EA=BX∨SI∨DI∨BP;∨表示或者
a、PA=DS×16+{BX∨SI∨DI}
b、PA=SS×16+BP
c、PA=越段寄存器×16+{BX∨SI∨DI∨BP}
5、寄存器相对寻址
直接变址寻址
┍BX┑
EA=├SI┥+{DISP}
├DI┥
┕BP┚
mov ax,count[si] ;ea=count+si,(ea)→ax,约定为DS
mov al,es:string[bp] ;越段前缀
6、基址变址寻址
使用数组和表格
EA={BX∨BP}+{SI∨DI}
pA=DS×16+BX+{SI∨DI}
pA=SS×16+BP+{SI∨DI}
mov cx,es:[bx][di]
mov ax,[bx][si] ;ea=bx+si,ea→ax
7、相对基址变址寻址
EA={BX∨BP}+{SI∨DI}+{DISP}
mov ax,array[bx][si] ;ea=array+bx+si,ea→ax
8、字符串寻址
movsb ;([si])=>([di]),si+1=>si,di+1=>di
;源=>目,可理解为mov [di],[si]
二、进栈时,先减小地址,出栈时,先出,再增加地址。
三、leal S,D;将s的结果放到D中。
四、控制指令对应的汇编。
If else:用cmp或test进行判断,利用jmp跳转到指定标号。
循环:结合cmp或test进行跳转。
Switch语句,先声明相应的标号,即跳转表,里面声明了标号的地址,然后根据判断条件直接跳到相应的标号位置。
过程:调用过程时,把返回地址压入,把相应的栈帧结构压入到栈中,bp寄存器为帧指针,存放该帧的终止地址,正确引用局部变量或参数,sp为栈指针,指向栈顶。调用完成时,还原现场。在x86-64中,如果参数比较少,直接存寄存器中,而不再需要栈帧。
数组的分配:二维数组也是连续分配的,先行,再列。
结构体在计算机中,其实就是一块连续的存储区域,根据偏移地址进行成员变量的访问。
数据对齐,汇编前面的.align 4,表示起始地址是4的倍数。
对抗栈缓冲区溢出:栈随机化、栈破坏检测,限制可执行代码区域。