《汇编语言程序设计》例子出现segmentation fault

        照着例子抄写了一下,直接用的 gcc 编译,源码如下,因为不支持 pushl,所以改成了 pushq

#cpuid.s View the CPUID Vendor ID string using C library calls
.section .data
output:
	.asciz "The processor Vendor ID is %s \n"

.section .bss
	.lcomm buffer, 12
	
.section .text
.global main
main:
	MOVL $0, %eax
	cpuid
	MOVL $buffer, %edi 	
	MOVL %ebx, (%edi)
	MOVL %edx, 4(%edi)
	MOVL %ecx, 8(%edi)
	
	pushq $buffer
	pushq $output
	call printf
	addl $8, %esp
	pushq $0
	call exit

如果使用 pushl 的话,在x86_64 位下不支持,如下错误信息:

 网上搜索到解决办法有 2 种,一种是在源码开头添加.code32 告诉编译器按照32位进行编译,另外一种是使用 pushq,q 即为 quad word 表示 8 字节长度的,即 64 位。编译通过后,运行时出现 segmentation fault。网上搜了很多,没有一样的,但很多相似的在调用 printf 的时候出现 segmentation fault,这个跟调用约定有关系,64 位和32 位还不一样,64 位下是通过寄存器和栈来传递参数的,而 32 位下则是通过栈来传递参数的。看上面的代码 pushq $buffer 和  pushq $output 就是入栈操作,而在 64 位下:整数参数(包含指针)依次放在

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值