您的位置:首页 > 理论基础

深入理解计算机系统:汇编基本概念

2011-12-02 10:27 375 查看
涉及的一些概念
  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的倍数。
对抗栈缓冲区溢出:栈随机化、栈破坏检测,限制可执行代码区域。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐