找回密码
 用户注册

QQ登录

只需一步,快速开始

查看: 3832|回复: 0

[原]linux下的C语言开发(AT&T 汇编语言)

[复制链接]
发表于 2012-1-16 10:16:21 | 显示全部楼层 |阅读模式
【 声明:版权所有,欢迎转载,请勿用于商业用途。  联系信箱:feixiaoxing @163.com】

    同样是x86的cpu,但是却可以用不同形式的汇编语言来表示。在window上面我们使用的更多是intel格式的汇编语言,而在Linux系统上面使用的更多的常常是AT&T格式的汇编语言。那什么是AT&T格式的汇编代码呢?我们可以写一个试试看。.data
  1.         msg: .string "hello!\n"
  2.         len = . - msg
  3. .text
  4. .global _start
  5. _start:
  6.         movl $len, %edx
  7.         movl $msg, %ecx
  8.         movl $1, %ebx
  9.         movl $4, %eax
  10.         int $0x80
  11.         movl $0, %ebx
  12.         movl $1, %eax
  13.         int $0x80
复制代码
    这是一个简单的汇编文件,我们可以分两步进行编译。首先,输入 as -gstabs -o hello.o hello.s, 接着输入ld -o hello hello.o即可。为了验证执行文件是否正确,可以输入./hello验证一下。
    在as命令当中,由于我们使用了-gstabs选项,因此在hello执行文件中是包含调试信息的。所以,如果想单步调试的朋友可以输入gdb hello进行调试。
    那么,hello执行文件反汇编的代码又是什么样的呢?我们可以输入objdump -S -d hello查看一下。08048074 <_start>:
  1. .text
  2. .global _start
  3. _start:
  4.         movl $len, %edx
  5. 8048074:       ba 08 00 00 00          mov    $0x8,%edx
  6.         movl $msg, %ecx
  7. 8048079:       b9 9c 90 04 08          mov    $0x804909c,%ecx
  8.         movl $1, %ebx
  9. 804807e:       bb 01 00 00 00          mov    $0x1,%ebx
  10.         movl $4, %eax
  11. 8048083:       b8 04 00 00 00          mov    $0x4,%eax
  12.         int $0x80
  13. 8048088:       cd 80                   int    $0x80
  14.         movl $0, %ebx
  15. 804808a:       bb 00 00 00 00          mov    $0x0,%ebx
  16.         movl $1, %eax
  17. 804808f:       b8 01 00 00 00          mov    $0x1,%eax
  18.         int $0x80
  19. 8048094:       cd 80                   int    $0x80
  20.         ret
  21. 8048096:       c3                      ret
  22.    
复制代码



作者:feixiaoxing 发表于2012-1-14 22:47:39 原文链接

您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

Archiver|手机版|小黑屋|ACE Developer ( 京ICP备06055248号 )

GMT+8, 2024-12-22 18:04 , Processed in 0.019788 second(s), 5 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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