板凳——————————————————(枯藤 )MIX汇编 前导(4)

这篇博客探讨了在64位Linux环境下如何实现汇编语言中的函数调用,通过示例展示了`push`和`pop`指令在不同情况下的使用,并解释了在64位模式下不能使用32位值的限制。博主还通过实验演示了不同的退出程序的方法,包括设置系统调用号和参数的正确方式。
摘要由CSDN通过智能技术生成

https://www.dazhuanlan.com/2020/01/17/5e216a2472e4c/
汇编学习笔记

这里主要讲述的是函数的调用,在汇编中是怎么实现的。但是我还是没看懂,要一点点的画寄存器的状态图吧。

首先,碰到了几个问题,我使用的Linux环境是64位的。

如果使用pushl和popl, 会出现 “invalid instruction suffix for push”
这是因为pushl和popl都是适用在32bit系统上的,因为64-bit 的系统,不接受32-bit的数值,所以用pushl 将立即数(immediate)入栈,会引发错误。32bit只接受16-bit和32-bit,64bit只接受16-bit和64-bit。
解决方法可以是: as –32 test.s -o test.o 这样,加上–32选项,表示强制按照32-bit mode来编译。但是,ld环境必须是32-bit mode的,不然会出现 ld: i386 architecture of input filepower.o’ is incompatible with i386:x86-64 output` 错误。
解决上述错误的方法: ld -m elf_i386 power.o -o power

如果使用push和pop,会出现错误operand type mismatch for 'push' 在语句 push %eax中。
这也是64-bit和32-bit的差别。在64-bit mode下面,push和栈进行交互的时候,不能使用%eax,而要使用%rax.其他命令亦如此。

如果想要在64bit下完整的使用32bit mode。那么按照下面三个方法改善:
    Add .code32 to the top of assembly code
    Assemble w
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值