AT&T 汇编-3: 使用整数

AT&T 汇编中,数字不能直接使用,需要在前面加一个“$”。而且根据指令的后缀来决定使用不同长度的数,例如后缀“l”(long)通常表示使用 32 位的操作数,“w”(word)表示 16 位,“b”(byte)表示 8 位等。系统提供了不同的方式来声明不同长度的数据。

# num.s

.section .rodata
msg:
   .asciz   "The value is: 0x%x.\n"
int8:
   .byte    0xda
int16:
   .short   0xabcd
int32:
   .int     0x12345678

.section .text
.globl main
main:
   movl  $0,   %eax
   movb  int8, %al
   pushl %eax
   pushl $msg
   call  printf
   addl  $8,   %esp

   pushw $0
   pushw int16
   pushl $msg
   call  printf
   addl  $8,   %esp

   pushl int32
   pushl $msg
   call  printf
   addl  $8,   %esp

   pushl $0
   call  exit

程序分别打印了 8 位,16 位和 32 位整数的值。

通过使用 gdb 发现栈的存储方式和内存的存储方式是一样的,即在内存中高地址的内容放在栈中高地址的位置,低地址的内容放在栈中低地址的位置。在程序的第 30 行加断点,然后使用 gdb 查看:

(gdb) x/4b &int32
0x8048518 <int32>:      0x78    0x56    0x34    0x12
(gdb) x/4b $esp
0xbf9731f8:     0x78    0x56    0x34    0x12

x86 系列的 cpu 对于多字节整数采用的是小端存储方式,即低地址存放整数的低字节,高地址存放高字节,像上面显示的那样,整数 int32 有 4 个字节,从高到低依次是:0x12,0x34,0x56,0x78,而低字节 0x78 放在了内存的低地址,0x12 放在高地址。与之相对的是大端存储方式,即高字节存放在内存低地址,低字节存放在内存高地址,0x12345678 在内存中的存储方式是(从低到高):0x12,0x34,0x56,0x78。

发表于 2011年5月2日
本文目前尚无任何评论.

发表评论

XHTML: 您可以使用这些标签: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>