3

我对汇编语言比较陌生。我找到了很多教程来解释如何使用 ML64 和 MASM32 创建 HelloWorld 应用程序,但没有一个详细解释程序。例如,看看下面的示例,我在网上找到并编译(64 位):

main proc
sub rsp, 68h      ; space for 4 arguments + 16byte aligned stack
xor r9d, r9d        ; 4. argument: r9d = uType = 0
lea r8, [caption]   ; 3. argument: r8  = caption
lea rdx, [text]     ; 2. argument: edx = window text
xor rcx, rcx        ; 1. argument: rcx = hWnd = NULL
call MessageBoxA
xor ecx, ecx        ; ecx = exit code
call ExitProcess
main endp

end

我可以通过这个。我知道有通用寄存器和段寄存器,但你如何决定使用哪个。例如,为什么 'r8' 包含标题而不是 r9?是否有 WinAPI 的程序集参考?我意识到这是一个基本问题。我选择了 MASM32 标签,因为这是一个带有 64 位示例的一般问题。

4

2 回答 2

2

例如,此处描述了Windows x64 调用约定

MessageBoxA 要了解参数的顺序,请在此处查找例如。

于 2012-03-20T14:12:56.087 回答
0

我建议几件事,首先分别学习汇编语言和学习操作系统调用。其次,不要以 x86 作为您的第一个汇编语言。让它成为你学习的第三个或第四个或最后一个。如果您觉得必须,我建议您从 8088/8086 开始并在 x86 中打下基础,然后再深入了解它的发展方向。

arm/thumb/msp430/mico8/avr 第一个、第二个、第三个等指令集都很好,如果不是第一个,第二个或第三个(不同的系列)你将在计算机如何工作方面有一个很好的基础。pcemu 不是我的,我分叉了一个版本并剥离了操作系统,因此它可以用来学习汇编语言。只需几美元,您就可以从英特尔获得 8088/8086 手册的二手副本

http://www.amazon.com/gp/product/1555120814

再次,为今天的 x86 奠定了良好的基础。

当所有这些都完成后,然后开始查看来自 asm 的操作系统调用...确保您可能需要一些来自 asm 的调用才能开始,例如打印某种形式以查看您的程序正在运行。

于 2012-03-20T14:26:08.150 回答