鱼C论坛

 找回密码
 立即注册
查看: 1442|回复: 2

Linux下汇编语言怎么用?

[复制链接]
发表于 2014-4-20 12:22:00 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
Linux下汇编语言怎么用?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-4-20 12:43:19 | 显示全部楼层
Intel汇编和AT&T汇编两者在语法格式上有着很大的不同:
在 AT&T 汇编格式中,寄存器名要加上 ' %' 作为前缀;而在 Intel 汇编格式中,寄存器名不需要加前缀。例如:
AT&T 格式
Intel 格式
pushl %eax
push eax
在 AT&T 汇编格式中,用 '$' 前缀表示一个立即操作数;而在 Intel 汇编格式中,立即数的表示不用带任何前缀。例如:
AT&T 格式
Intel 格式
pushl $1
push 1
AT&T 和 Intel 格式中的源操作数和目标操作数的位置正好相反。在 Intel 汇编格式中,目标操作数在源操作数的左边;而在 AT&T 汇编格式中,目标操作数在源操作数的右边。例如:
AT&T 格式
Intel 格式
addl $1, %eax
add eax, 1
在 AT&T 汇编格式中,操作数的字长由操作符的最后一个字母决定,后缀'b'、'w'、'l'分别表示操作数为字节(byte,8 比特)、字(word,16 比特)和长字(long,32比特);而在 Intel 汇编格式中,操作数的字长是用 "byte ptr" 和 "word ptr" 等前缀来表示的。例如:
AT&T 格式
Intel 格式
movb val, %al
mov al, byte ptr val
在 AT&T 汇编格式中,绝对转移和调用指令(jump/call)的操作数前要加上'*'作为前缀,而在 Intel 格式中则不需要。
远程转移指令和远程子调用指令的操作码,在 AT&T 汇编格式中为 "ljump" 和 "lcall",而在 Intel 汇编格式中则为 "jmp far" 和 "call far",即:
AT&T 格式
Intel 格式
ljump $section, $offset
jmp far section:offset
lcall $section, $offset
call far section:offset
与之相应的远程返回指令则为:
AT&T 格式
Intel 格式
lret $stack_adjust
ret far stack_adjust
在 AT&T 汇编格式中,内存操作数的寻址方式是
section:disp(base, index, scale)

而在 Intel 汇编格式中,内存操作数的寻址方式为:
section:[base + index*scale + disp]

由于 Linux 工作在保护模式下,用的是 32 位线性地址,所以在计算地址时不用考虑段基址和偏移量,而是采用如下的地址计算方法:
disp + base + index * scale

下面是一些内存操作数的例子:
AT&T 格式
Intel 格式
movl -4(%ebp), %eax
mov eax, [ebp - 4]
movl array(, %eax, 4), %eax
mov eax, [eax*4 + array]
movw array(%ebx, %eax, 4), %cx
mov cx, [ebx + 4*eax + array]
movb $4, %fs:(%eax)
mov fs:eax, 4
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-4-20 21:11:42 | 显示全部楼层
本帖最后由 oggplay 于 2014-4-20 21:17 编辑

别混用了,linux用的是AT&T格式,intel语法linux下用不了,唯一可以混用的就是nasm编译器,不过有相当难度。所以专精一门就好,否则你会头疼的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-18 02:49

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表