这或多或少是一个好的程序,还是我滥用了任何操作等?
首先,是的。
然而,汇编是关于效率的,所以最后一条语句是不必要的:
mov %eax, %edx
程序集文件是否总是必须具有一个全局函数,例如 main
不必要。例如,它可以是您可以从 C/C++ 代码调用的其他函数。但是,如果您想从中生成可执行文件,则需要main或者_start如果您将其ld用作链接器。
“逐行运行代码”?
为此,您需要一个调试器。如果您想学习汇编,这将是最重要的事情。你会想看看寄存器,看看值是如何变化的,标志发生了什么等等。我给出了一个答案,解释了如何设置调试器和单步调试你的代码。组装时需要-g标志gcc来调试代码。
一个基本的例子:
- 编译
-g
gcc -g file.s -o file
tui以模式启动 gdb 。
> gdb --tui ./file
> start # this will automatically start the program and break at main:
> layout regs # show registers at the top (you will need this a lot)
> n # next instruction
> si # step into, when you use functions, si into function
在 gdb 中按 enter 将自动再次执行最后一个命令。这将使您免于n一遍又一遍地打字。还有一些命令:
> b 2 # break at line 2
> b func # break at label func
> b main # break at main
> print/x $eax # print value in eax in hex form, there are other /format specifiers, print/d (decimal), print/s string, print/t (binary)
> x/s $eax # print string pointed to by eax
> info frame # look at the current stack frame
这些是您需要的最常见的说明。您可以键入help command_name以获取有关命令的更多信息。并且有各种备忘单等可以帮助您解决这个问题。
如果你愿意,你也可以得到一个 gui,我个人不太喜欢它们。结帐 Nemiver,这非常好。gdbgui可以使用设置,pip但它对于调试 asm 并不是很好,因为看寄存器很痛苦。有ddd一个我最喜欢的,但它的 gui 是 1970 年代的,所以......
最后,查找操作码的最佳资源是什么?
最好的资源是英特尔手册,但是如果您刚刚开始阅读,它们可能有点难以阅读。我会推荐Felix Cloutier 的 x86 asm 参考。x86标签 wiki中有很多信息和参考资料。
您可能还想阅读Linux 的调用约定并查找您将非常需要的Linux 系统调用。如果您打算编程或只是想了解更多关于计算机的知识,我强烈建议您阅读Programming from the Ground Up一书,该书可免费获得并使用 AT&T 风格的程序集。然而它有点过时了,所以你必须用谷歌搜索。它有一个包含常见 x86 指令的附录,这将非常有帮助。