汇编在不同写法对比

绝大多数 Linux 程序员以前只接触过DOS/Windows 下的汇编语言,这些汇编代码都是 Intel 风格的。但在 Unix 和 Linux 系统中,更多采用的还是 AT&T 格式,两者在语法 格式上有着很大的不同:
1 在 AT&T 汇编格式中,寄存器名要加上 ‘%’ 作为前缀;而在 Intel 汇编格式中,寄存 器名不需要加前缀。例如:
2 在 AT&T 汇编格式中,用 ‘$’ 前缀表示一个立即操作数;而在 Intel 汇编格式中,立 即数的表示不用带任何前缀。例如:
3AT&T 和 Intel 格式中的源操作数和目标操作数的位置正好相反。在 Intel 汇编格式 中,目标操作数在源操作数的左边;而在AT&T 汇编格式中,目标操作数在源操作数的 右边。例如:
4 在 AT&T 汇编格式中,操作数的字长由操作符的最后一个字母决定,后缀’b’、‘w’、‘l’ 分别表示操作数为字节(byte,8 比特) 、字(word,16 比特)和长字(long,32比特) ; 而在 Intel 汇编格式中,操作数的字长是用 “byte ptr” 和 “word ptr” 等前缀来表示的。 例如:
5 在 AT&T 汇编格式中,绝对转移和调用指令(jump/call)的操作数前要加上’'作为前 缀,而在 Intel 格式中则不需要。
6 远程转移指令和远程子调用指令的操作码,在 AT&T 汇编格式中为 “ljump” 和 “lcall”,而在 Intel 汇编格式中则为 “jmp far” 和 “call far”,即:
与之相应的远程返回指令则为:
7 在 AT&T 汇编格式中,内存操作数的寻址方式是 section:disp(base, index, scale)
而在 Intel 汇编格式中,内存操作数的寻址方式为: section:[base + index
scale + disp]
由于 Linux 工作在保护模式下,用的是 32 位线性地址,所以在计算地址时不用考虑段 基址和偏移量,而是采用如下的地址计算方法:
disp + base + index * scale

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值