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

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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值