【发布时间】:2011-10-16 00:58:34
【问题描述】:
我正在做一些 x86 练习;我的作业让我在调试器中单步执行write() 库调用的汇编代码,直到我们到达SYSENTER 指令,但我得到的结果与我的一些同学不同。我看到导致SYSENTER 的是:
│0xf7fdf421 <__kernel_vsyscall+1> push %edx
│0xf7fdf422 <__kernel_vsyscall+2> push %ebp
│0xf7fdf423 <__kernel_vsyscall+3> mov %esp,%ebp
│0xf7fdf425 <__kernel_vsyscall+5> sysenter
这是我应该看到的吗?如果是这样,为什么它与我的一些同学看到的不同?
在执行sysenter 指令之前,%edx 和 %ebp 寄存器是否也保存在堆栈中? (根据我得到的答案会不会看起来不是这样,还是我错了?)
这是我作业的原始说明:
汇编代码:
.file "A3Program2.c"
.section .rodata
.LC0:
.string "hello\n"
.LC1:
.string "xxxx\n"
.text
.globl secondCall
.type secondCall, @function
secondCall:
pushl %ebp
movl %esp, %ebp
subl $40, %esp
movl $6, 8(%esp)
movl $.LC0, 4(%esp)
movl $1, (%esp)
call write
movl %eax, -12(%ebp)
movl $8, 8(%esp)
movl $.LC1, 4(%esp)
movl $1, (%esp)
call write
addl %eax, -12(%ebp)
movl 12(%ebp), %eax
movl 8(%ebp), %edx
leal (%edx,%eax), %eax
addl %eax, -12(%ebp)
movl -12(%ebp), %eax
leave
ret
.size secondCall, .-secondCall
.globl firstCall
.type firstCall, @function
firstCall:
pushl %ebp
movl %esp, %ebp
subl $40, %esp
movl $2, 4(%esp)
movl $4, (%esp)
call secondCall
movl %eax, -12(%ebp)
movl -12(%ebp), %eax
leave
ret
.size firstCall, .-firstCall
.globl main
.type main, @function
main:
pushl %ebp
movl %esp, %ebp
andl $-16, %esp
subl $16, %esp
call firstCall
movl %eax, 12(%esp)
movl $0, %eax
leave
ret
.size main, .-main
.ident "GCC: (Ubuntu/Linaro 4.4.4-14ubuntu5) 4.4.5"
.section .note.GNU-stack,"",@progbits
以下说明适用于 Linux:
在 secondCall 中找到第二个调用 write 的行号,“call write” 功能。在这一行设置一个断点。据我说是22。
在此行设置断点。
break 22
在调试器中运行程序。
run
程序将在您设置的断点处停止。 进入没有调试信息的代码。
si
您将在源布局中看到“[No Source Available]”。所以你需要查看 反汇编指令。
layout asm
反复 step into (si 然后回车/回车就会执行 si 命令 重复)直到您看到“sysenter”出现在屏幕的 asm 布局部分。 我正在尝试从 asm 布局部分的顶部复制指令(包括它们的地址),一直到并包括 sysenter 指令。
提示:您可以通过键入 Ctrl-x o 将键盘的焦点更改为命令区域。这 箭头键可用于恢复较早的命令的方式(它只是节省了一些 打字)。
【问题讨论】:
-
请不要在得到答案时编辑掉问题的内容。如果可以在下面找到答案,请接受;否则写下你找到的答案并接受你自己的答案。这将有助于将来有相同问题的搜索者。
-
所以发布您的答案,以便其他人受益。或者不要理会这个问题,希望有人会出现并发布对其他人有帮助的答案。不要只是删除所有上下文。我花了相当长的时间来回答我的问题,我希望看到它对其他人有所帮助,即使您不关心答案。
-
如果您真的想删除您的问题,请将其标记为版主注意,并在说明中给出充分的理由。
-
我自己不会再回复这个了。但我已经向版主报告了这一点。你来这里寻求建议,即使你认为你不再想要它,你至少可以把这个问题留在一个可以帮助其他人的形式中。无论如何,在底部添加一些内容说“我不再关心”,但是要求一个答案,甚至不说为什么就拒绝它,然后让问题(和答案!)对其他人无用只是简单的 粗鲁。
标签: c linux assembly x86 system-calls