assembly - 在 GAS x86 程序集中传递参数时遇到问题
问题描述
我正在尝试为该compare(int x, int y)
函数设置两个参数,但是当我将它们传入时,我没有得到预期的结果,并且当我使用 gdb 检查寄存器时,它们似乎没有正确的值。
我设置了参数并像这样调用函数:
movl $10, (%esp)
movl $10, 8(%esp)
call compare
这是返回 1 ifx==y
和 0 if的函数x!=y
compare:
pushl %ebp
movl %esp, %ebp
movl (%ebp), %eax
movl 8(%ebp), %edx
cmpl %eax, %edx
jne .L28
.L29:
movl $1, %eax
jmp .L30
.L28:
movl $0, %eax
jmp .L30
.L30:
popl %ebp
ret
我将两个变量都设置为 10 用于测试目的,但我仍然得到 0 的结果
解决方案
让我们看看在ebp
使用之前堆栈的状态是什么compare()
。
调用compare()
:
movl $10, (%esp)
movl $10, 8(%esp)
call compare
并推ebp
入compare
,即:
pushl %ebp
使堆栈保持以下状态:
Values Address
------------------
| 10 |
------------------ <- ESP+16
| undefined |
------------------ <- ESP+12
| 10 |
------------------ <- ESP+8
| return address |
------------------ <- ESP+4
| saved EBP |
------------------ <- ESP
在movl %esp, %ebp
in之后compare()
,两者esp
和ebp
具有相同的值。
movl (%ebp), %eax
movl 8(%ebp), %edx
查看上图,这些说明应该是:
movl 8(%ebp), %eax
movl 16(%ebp), %edx
推荐阅读
- java - Java if 语句不起作用
- jquery - jQuery Div 链接 - Google 查询数据 Href 吗?
- javascript - 需要角度输入文件
- java - Java无界通配符误区
- model-view-controller - 如何在 VS 2017 C# 和 MVC 5 中使用 ASP.Net MVC 子操作
- javascript - 在 Zapier 中解码原始数据
- ruby-on-rails - 在 SQL 数据库中保存带有链接的文本
- javascript - 同一页面上带有 JSON 数据的 chart.js 未显示
- python - Newspaper3k 语法错误或错误的 python 版本?
- android-studio - Android Studio - 从 MapsActivity 返回上一个活动时应用程序崩溃