二进制-AT&T汇编学习及堆栈内存分布(和Intel汇编对比)


为什么要学at&t的语法呢?因为unix系列gcc编译器使用的是at&t的语法,windows系列的vc才使用的是intel的语法。
linux上看汇编当然是看的at&t语法的。

64位寄存器32位寄存器命名规范

%rax 64位寄存器
%eax 32位寄存器
%ax 16位寄存器
%ah 8位寄存器高位寄存器
%al 8位寄存器低位寄存器

通用寄存器功能

用来存储正在存储的数据,%eax表示32位寄存器,%rax表示64位寄存器。
%eax 用于存储操作数和结果
%ebx 指向数据内存段中数据的指针
%ecx 字符串和循环操作的计数器
%edx IO指针
%edi 用于字符串操作的目标数据指针
%esi 用于字符串操作的源数据指针
%esp 堆指针
%ebp 堆栈数据指针

段寄存器

用来处理内存访问,均为16位寄存器。
%cs 代码段起始指针(code segment)
%ds 数据段起始指针(data segment)
%ss 堆栈段起始指针(stack segment)
%es 附加段起始指针(extra segment)
%fs 附加段起始指针
%gs 附加段起始指针 一般存储基址

EIP寄存器

%eip寄存器保存下一次要执行的指令,从CS寄存器中取值。
程序不能显式地为CS寄存器复制。当程序被分配到一个内存空间时。CPU为CS寄存器赋值。

标志寄存器

16位寄存器,也称为PSW,程序状态字。
%cf 进位标识,最高位产生了进位或者借位,cf=1,否则cf=0
%zf 零标识,运算结果为0,则zf=1,否则zf=0
%sf 符号标志,也可以理解为负号标志,运算结果为负数,sf=1,否则sf=0
%of 溢出标志,当有符号数运算发生了溢出,则of=1,否则of=0

AT&T和Intel汇编对比图
AT&T和Intel汇编对比图
堆栈内存分布图
堆栈内存分布图

声明:物博网|版权所有,违者必究|如未注明,均为原创|本网站采用BY-NC-SA协议进行授权

转载:转载请注明原文链接 - 二进制-AT&T汇编学习及堆栈内存分布(和Intel汇编对比)


喜欢安全与WEB开发