linux smp lock 锁总线 内嵌汇编,AT&T汇编语言与GCC内嵌汇编简介

AT&T汇编语言与GCC内嵌汇编简介

AT&T汇编语言语法与INTEL汇编语法的差别,然后介绍GCC内嵌汇编语法。阅读本节需要读者具有INTEL

汇编语言基础。

1 AT&T 与INTEL的汇编语言语法的区别

1.1

指令大小写

INTEL格式的指令使用大写字母,而AT&T

格式的使用小写字母。

例:

INTEL AT&T

MOV EAX,EBX movl %ebx,%eax

1.2

指令操作数赋值方向

在INTEL语法中,第一个表示目的操作数,第二个表示源操作数,赋值方向从右向左。

AT&T语法第一个为源操作数,第二个为目的操作数,方向从左到右,合乎自然。

例:

INTEL AT&T

MOV EAX,EBX movl %ebx,%eax

1.3

指令前缀

在INTEL语法中寄存器和立即数不需要前缀;

AT&T中寄存器需要加前缀“%”;立即数需要加前缀“$”。

例:

INTEL AT&T

MOV EAX,1 movl $1,%eax

符号常数直接引用,不需要加前缀,如:

movl value , %ebx

value为一常数;

在符号前加前缀 $, 表示引用符号地址,

movl $value, %ebx

是将value的地址放到ebx中。

总线锁定前缀“lock”:

总线锁定操作。“lock”前缀在Linux

核心代码中使用很多,特别是SMP

代码中。当总线锁定后其它CPU

不能存取锁定地址处的内存单元。

远程跳转指令和子过程调用指令的操作码使用前缀“l“,分别为ljmp,lcall,

与之相应的返回指令伪lret。

例:

INTEL AT&T

lcall $secion:$offset

JMP FAR SECTION:OFFSET ljmp $secion:$offset

RET FAR SATCK_ADJUST lret $stack_adjust

1.4 间接寻址语法

INTEL中基地址使用“[”、“]”,而在AT&T“(”、“)”;

另外处理复杂操作数的语法也不同,

INTEL为Segreg:[base+index*scale+disp]

,而在AT&T中为%segreg:disp(base,index,sale),其中segreg

,index,scale,disp都是可选的,在指定index而没有显式指定Scale

的情况下使用默认值1。Scale,disp不需要加前缀“&”。

INTEL AT&T

Instr foo,segreg:[base+index*scale+disp] instr %segreg:disp(base,index,scale),foo

1.5

指令后缀

AT&T

语法中大部分指令操作码的最后一个字母表示操作数大小,“b”表示byte

(一个字节);“w”表示word(2,个字节);“l”表示long(4,个字节)。

INTEL中处理内存操作数时也有类似的语法如:

BYTE PTR、WORD PTR、DWORD PTR。

例:

INTEL AT&T

mov al, bl movb %bl,%al

mov ax,bx movw %bx,%ax

mov eax, dword ptr [ebx] movl (%ebx), %eax

AT&T汇编指令中,操作数扩展指令有两

个后缀,一个指定源操作数的字长,另一个指定目标操作数的字长。AT&T的符号扩展指令的为“movs”,零扩展指令为“movz

”(相应的Intel指令为“movsx”和“movzx”)。因此,“movsbl %al,%edx”表示对寄存器al

中的字节数据进行字节到长字

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值