wordpress   发布时间:2022-04-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了编写Windows x86程序集大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

概述

我想用X86汇编为 Windows编写简单的程序(控制台输入/输出),主要是因为我只是好奇.如果有人能指出我正确的方向,那就太好了.我已经对一些更简单的x86指令,寄存器的功能等有了相当好的理解,但对于程序如何与操作系统连接并使用标准输入和输出仍然是一个谜.我知道这些东西与advapi32.dll和kernel32.dll这样的库有关,并且有相关的静态库.lib文件,它们使编译器能够使用这些动态链
@H_301_0@
@H_301_0@
我想用X86汇编为 Windows编写简单的程序(控制台输入/输出),主要是因为我只是好奇.如果有人能指出我正确的方向,那就太好了.我已经对一些更简单的x86指令,寄存器的功能等有了相当好的理解,但对于程序如何与操作系统连接并使用标准输入和输出仍然是一个谜.我知道这些东西与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,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,请注明来意。