gpt4 book ai didi

windows - 为 Windows x86 编写程序集

转载 作者:可可西里 更新时间:2023-11-01 14:15:05 26 4
gpt4 key购买 nike

我想使用 x86 程序集为 Windows 编写简单的程序(控制台输入/输出),主要是因为我只是好奇。如果有人能指出我正确的方向,那就太好了。我已经对一些更简单的 x86 指令、寄存器的功能等有了相当好的理解,但程序如何与操作系统接口(interface)以及如何使用标准输入和输出对我来说仍然是个谜。我知道这些事情与 advapi32.dll 和 kernel32.dll 等库有关,并且有相关的静态库 .lib 文件使编译器能够使用这些动态链接库,但除此之外我不知道这是怎么回事发生。我什至不清楚 C 等语言中的头文件如何使用 .lib 文件。

最佳答案

也许最简单的方法是为构建一些简单的程序提供指导,并让您从那里进行推断。首先你需要一些源代码:

.386
.MODEL flat, stdcall

; This is what would come from a header -- a declaration of a the Windows function:
MessageBoxA PROTO near32 stdcall, window:dword, text:near32,
windowtitle:near32, style:dword

.stack 8192

.data
message db "Hello World!", 0
windowtitle db "Win32 Hello World.", 0

.code
main proc
invoke MessageBoxA, 0, near32 ptr message, near32 ptr windowtitle, 0
ret
main endp
end main

要构建它,我们将像这样调用 masm:

ml hello32.asm -link -subsystem:windows user32.lib

这告诉它要组装的文件,当它链接时,告诉它链接它作为 Windows 子系统(主要的选择是 -subsystem:console)并链接 user32.lib。后者为我们提供了MessageBoxA的定义。

写入控制台的类似程序(奇怪的是)有点复杂:

.386
.MODEL flat, stdcall

getstdout = -11

WriteFile PROTO NEAR32 stdcall, \
handle:dword, \
buffer:ptr byte, \
bytes:dword, \
written: ptr dword, \
overlapped: ptr byte

GetStdHandle PROTO NEAR32, device:dword

ExitProcess PROTO NEAR32, exitcode:dword

.data
message db "Hello World!", 13, 10
msg_size dd $ - offset message

.data?
written dd ?

.code
main proc
invoke GetStdHandle, getstdout

invoke WriteFile, \
eax, \
offset message, \
msg_size, \
offset written, \
0

invoke ExitProcess, 0
main endp
end main

构建几乎相同,除了它使用控制台,所以我们指定控制台子系统,我们使用的函数在内核中定义:

ml hello_console.asm -link -subsystem:console kernel32.lib

header 将包含我在上面为 MessageBoxAGetStdHandleWriteFile 等给出的声明的等价物。每个 header 将不过通常会有更多的函数——例如,kernel32 中的所有函数可能都在一个头文件中。

就图书馆而言,所涉及的机制有些牵扯,但大多无关紧要。要完成这项工作,您可以查看(例如)MSDN,查看要链接的库,然后将其添加到命令行。

更复杂的解释是,至少当您链接静态库时,它会简单地找到您调用的任何函数,并将每个函数的副本放入您的可执行文件/DLL 中。如果(如上)您正在使用 DLL 中的代码,它基本上只是将一条记录放入可执行文件中,告诉它依赖于哪个 DLL 中的哪个函数。然后,当您加载/运行该程序时,加载程序会查找您的程序所依赖的所有 DLL,并加载它们(当然,也会递归加载它们所依赖的任何内容)。然后加载程序修复这些引用,因此 DLL 中对函数的引用会被分配给该 DLL 中该函数的任何地址填充。

关于windows - 为 Windows x86 编写程序集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10868171/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com