大佬教程收集整理的这篇文章主要介绍了编写Windows x86程序集,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
.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,near32 ptr message,near32 ptr windowtitle,0 ret main endp end main
要构建它,我们会@L_884_17@masm:
@H_568_23@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
构建几乎是相同的,除了它使用控制台,因此我们指定控制台子系统,我们正在使用的函数在内核中定义:
@H_568_23@ml Hello_console.asm -link -subsystem:console kernel32.lib
标头将包含我在上面给出的messageBoxA,GetStdHandle,WriteFile等的声明的等价物.每个标头通常会有更多的声明 – 例如,kernel32中的所有函数可能都在一个标题中.
对于图书馆来说,所涉及的机制有些牵连,但大多不相关.要完成工作,请查看(例如)R_200_11845@SDN,并查看要链接的库,并在命令行中添加它.
更复杂的解释是,至少当您链接到静态库时,它只是找到您调用的任何函数,并将每个函数的副本放入您的可执行文件/ DLL中.如果(如上所述)你正在使用DLL中的代码,它基本上只是将一条记录放入可执行文件中,该记录告诉它所依赖的DLL中的函数.然后,当你加载/运行程序时,加载器会查找你的程序所依赖的所有DLL,并加载它们(当然也可以递归地加载它们所依赖的任何东西).然后加载器修复这些引用,因此DLL中函数的引用将填入该DLL中为该函数分配的任何地址.
以上是大佬教程为你收集整理的编写Windows x86程序集全部内容,希望文章能够帮你解决编写Windows x86程序集所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。