linux中汇编语言指令li,linux中的汇编语言

本文探讨了Intel和AT&T两种汇编语言格式的区别,包括字母大小写、寄存器前缀、操作数顺序、指令后缀、直接操作数前缀、转移指令前缀以及间接寻址方式的不同。通过这些对比,帮助读者理解和适应不同环境下汇编语言的使用。
摘要由CSDN通过智能技术生成

linux内核源代码情景分析 上 读书笔记(二)

在Dos和windows领域中,汇编语言都是采用Intel所定义的格式,我以前学习的汇编语言教科书也是采用Intel格式,然而在Unix/linux领域,采用的却是AT&T的格式,所以一开始看起来还是有点不习惯,那么这两种格式到底有哪些差异了?下面我总结了一下:

1,在Intel格式中一般采用大写字母,然而在AT&T中一般采用小写字母,

2,在AT&T格式中,寄存器名前面需要加上“%”作为前缀,而在Intel格式中不需要,

3,在AT&T格式中,指令的源操作数和目标操作数的顺序正好和Intel格式相反,在Intel中是目标在前,源在后,AT&T中正好相反。

例如: 在Intel中 :MOV EAX,EBX 是把ebx中的值mov到eax中

在AT&T中 : mov %ebx,%eax 实现相同的功能

4,在AT&T的格式中,访存指令的操作数宽度由操作码的后缀也就是操作码的最后一个字母来决定,用作操作码后缀的字母有b(表示8位),w(表示16位),l(表示32位)。而在Intel格式中,则是在表示内存单元的操作数前面加上“BYTE

PTR”,“WORD PTR”,或者“DWORD PTR”.

例如: 在Intel中: MOV AL,BYTE PTR FOO 将FOO所指的内存单元中的字节取入8位寄存器AL中,

在AT&T中: movb FOO %al

5,在AT&T格式中,直接操作数要加上"$"作为前缀,在Intel格式中不带前缀。

例如:在Intel中:PUSH 4

在AT&T中:pushl $4

6,在AT&T格式中,绝对转移和调用指令jmp/call的操作数,要加上“*”作为前缀,而Intel格式中不带。

7,远程的跳转指令和子程序调用指令的操作码,在AT&T格式中是“ljmp”和“lcall”,而在Intel格式中是

“JMP FAR”和“CALL FAR”

8,间接寻址的一般格式:

与Intel的语法比较,AT&T间接寻址方式可能更晦涩难懂一些。

Intel的指令格式是segreg:[base+index*scale+disp],

而AT&T的格式是%segreg:disp(base,index,scale)。

其中index/scale/disp/segreg全部是可选的,完全可以简化掉。

如果没有指定scale而指定了index,则scale的缺省值为1。segreg段寄存器依赖于指令以及应用程序是运行在实模式还是保护模式下,在实模式下,它依赖于指令,而在保护模式下,segreg是多余的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值