码迷,mamicode.com
首页 > 其他好文 > 详细

64位gcc编译32位汇编

时间:2015-01-31 21:51:57      阅读:724      评论:0      收藏:0      [点我收藏+]

标签:

  由于使用as和ld来编译链接汇编程序,在使用C库的时候比较麻烦,需要输入比较多的指令,所以使用gcc进行编译链接。由于书中内容是32位汇编程序,但是机器使用的是64位操作系统,自带的gcc也是64位的,导致编译生成的程序,一运行就会Segment Fault。经过查询之后,发现是调用printf函数的时候,总是报错,查询之后发现是32位汇编和64位汇编在调用C库的时候,32位使用pushl指令来压栈传递参数,而64位汇编是使用通用寄存器来传递参数的。

  32汇编的代码是:

 1 .code32
 2 .section .data
 3 output:
 4     .asciz "The processor Vendor ID is ‘%s‘\n"
 5 
 6 .section .bss
 7     .lcomm buffer, 12
 8 
 9 .section .text
10 .globl main
11 main:
12     movl $0, %eax
13     cpuid
14 
15     movl $buffer, %edi
16     movl %ebx, (%edi)
17     movl %edx, 4(%edi)
18     movl %ecx, 8(%edi)
19 
20     pushl $buffer
21     pushl $output
22     call printf
23     addl $8, %esp
24 
25     pushl $0
26     call exit

 

  64位汇编需要这么写:

.section .data
output:
 .asciz "The Processor Vendor ID is ‘%s‘\n"
.section .bss
 .lcomm buffer, 12
.section .text
.globl main
main:
 movq $0, %rax
 cpuid
 movq $buffer, %rdi
 movq %rbx, (%rdi)
 movq %rdx, 4(%rdi)
 movq %rcx, 8(%rdi)
 movq $buffer, %rsi #1st parameter
 movq $output, %rdi #2nd parameter
 movq $0, %rax
 call printf
 addq $8, %rsp
 pushq $0
 call exit

  从两种代码中可以看出来,64位汇编首先mov使用的是movq,32位是movl,而且64位调用printf使用的通用寄存器传递参数,而32位使用的是pushl压栈来传递参数的。

  但是64位gcc编译生成的32位汇编程序运行就会报错,所以需要让gcc兼容32位汇编,首先在编译的时候加上-m32参数选项,但是光这样,编译的时候会报错,还需要下载gcc的32位兼容包,在ubuntu下使用的指令

  sudo apt-get install g++-multilib libc6-dev-i386,参考http://www.cyberciti.biz/tips/compile-32bit-application-using-gcc-64-bit-linux.html

  然后再使用指令gcc -g -m32 -o cpuid2 cpuid2.s编译生成,就可以正常运行了

64位gcc编译32位汇编

标签:

原文地址:http://www.cnblogs.com/chobits/p/4264724.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!