首页 > 代码库 > 64位gcc编译32位汇编
64位gcc编译32位汇编
由于使用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 .text10 .globl main11 main:12 movl $0, %eax13 cpuid14 15 movl $buffer, %edi16 movl %ebx, (%edi)17 movl %edx, 4(%edi)18 movl %ecx, 8(%edi)19 20 pushl $buffer21 pushl $output22 call printf23 addl $8, %esp24 25 pushl $026 call exit
64位汇编需要这么写:
.section .dataoutput: .asciz "The Processor Vendor ID is ‘%s‘\n".section .bss .lcomm buffer, 12.section .text.globl mainmain: 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位汇编
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。