AT&T ASM 学习3

.section -->

.data

.rodata(只读)

----------------------------------------

.ascii

.asciz

 

.byte          8位

 

.short         16位

.int             32位

.long           32位

.quad           8字节

.octa           16字节

 

.single        32位

.float          32位

.double       64位

----------------------------------------

output:
  .asciz "The processor Vendor ID is '%s'/n"

sizes:

 .long  100,150,200,250,300              #数组

----------------------------------------

.equ  factor,3                                  #预定义,等价于#define factor   3

.equ  LINUX_SYS_CALL,0x80

----------------------------------------

.section .bss

   .comm   buffer,10                 #10字节

   .lcomm        #local

----------------------------------------

.section .data

buffer1:

   .fill   10000     #10000个字节,用0填充         #这10000个字节会使可执行文件增大至少10000个字节

.section .bss

   .lcomm  buffer2,10000           #这10000个字节会使可执行文件增大很少的字节(大概23个字节), 程序加载后再申请10000字节空间

.section .text

.globl _start

_start:

  movl  $1,%eax

  movl  $0,%ebx

  int     $0x80

----------------------------------------

mov 与intel汇编格式相反

movb           8

movw          16

movl            32

movq           64

 

movsx

----------------------------------------

X86指令不允许同时直接操作两个内存中的数。

----------------------------------------

.section .data

value:

  .int   1

.section .text

.globl _start

_start:

  movl   value,%ecx    编译后 --> movl   0xXXXXXXXX,%ecx    #把存储的值给了ecx

  movl   %ecx,value   编译后 --> movl   %ecx,0xXXXXXXXX    #把ecx的值存储在了value所在的位置

  movl  $1,%eax

  movl  $0,%ebx

  int     $0x80

----------------------------------------

base_address(offset_address,index,size)             #如果其中的任何值为0,可不写;

==base_address+offset_address+index*size       #offset_address和index的值必须是寄存器;

 

movl  $2, %edi

movl  values(,%edi,4),%eax    #把values+8开始的数据放到 eax

----------------------------------------

movl  $values,%edi             --> movl  $0xXXXXXXXX,%edi

movl  %ebx,(%edi)               #(%edi)取edi中的值,此时等价于一个地址

----------------------------------------

echo $?    #查看上一个程序执行后的返回码(ebx中的值)

----------------------------------------

变量的标签只是一个地址,编译时会用这个地址替换掉代码中标签出现的地方

----------------------------------------

条件传送指令可以避免处理器执行JMP指令,这有助于处理器的预取缓存状态,通常能提高应用程序的速度。

cmov

 无符号条件传送指令依靠CF(进位标志)ZF(零标志)PF(奇偶标志)来判断

 有符号条件传送指令依靠SF(符号标志)ZF(零标志)OF(溢出标志)来判断

----------------------------------------

cmp  a,b            #  b-a   ; a和b可以是寄存器或存储器地址,但不能同时为存储器地址,a还可以为立即数,但b不能为立即数。

----------------------------------------

数据交换指令

XCHG              交换值。操作数是内存时,处理器的LOCK信号被自动标明,LOCK操作很耗费时间

BSWAP           反转字节顺序

XADD              交换并相加

CMPXCHG       比较和交换

CMPXCHG8B   比较和交换(64位)

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值