Assembly 使用字节值参数运行程序的程序集(MASM)?

Assembly 使用字节值参数运行程序的程序集(MASM)?,assembly,command-line-arguments,masm,irvine32,Assembly,Command Line Arguments,Masm,Irvine32,我正在编写一个汇编程序,它需要一个字符串和一个字节数组作为运行时参数。(字节不固定为字符值,并且都是0到255之间的无符号值) 执行命令示例: Program.exe "A 32 byte array (fixed size)" "A Byte array of arbitrary length, (greater than 0)" 如何在汇编中获取参数?同样与问题无关的是,字节数组可以是任意长度,如果数组长度大于某个大小,是否会有问题?。参数将在运行时加载到内存中,并在程序执行时进

我正在编写一个汇编程序,它需要一个字符串和一个字节数组作为运行时参数。(字节不固定为字符值,并且都是0到255之间的无符号值)

执行命令示例:

     Program.exe "A 32 byte array (fixed size)" "A Byte array of arbitrary length, (greater than 0)"

如何在汇编中获取参数?同样与问题无关的是,字节数组可以是任意长度,如果数组长度大于某个大小,是否会有问题?。参数将在运行时加载到内存中,并在程序执行时进行更改,然后以新状态返回数组。(我使用汇编来加快处理时间)

要获取C中argv之类的列表中的参数,您需要一个没有随Irvine的书附带的shell32.lib(据我在免费示例中看到的)。您可以在此处获得适当的shell32.lib:。安装Masm32后,您可以使用我的示例:

INCLUDE Irvine32.inc

IncludeLib C:\masm32\lib\shell32.lib
GetCommandLineW PROTO STDCALL
CommandLineToArgvW PROTO STDCALL, :DWORD, :DWORD
WideCharToMultiByte PROTO STDCALL :DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD

.DATA
    szArglist   dd ?
    nArgs       dd ?
    arg         db 8192 dup (?) ; http://blogs.msdn.com/b/oldnewthing/archive/2003/12/10/56028.aspx

.CODE
main PROC

    invoke GetCommandLineW
    invoke CommandLineToArgvW, eax, OFFSET nArgs
    test eax, eax
    jz @@exit

    mov [szArglist], eax        ; Store the result of CommandLineToArgvW for LocalFree
    mov esi, [eax]              ; esi: *szArglist

    @@:
    invoke WideCharToMultiByte, 0,0,esi,-1,OFFSET arg,SIZEOF arg,0,0
    mov edx, OFFSET arg
    call   writeString          ; Write string to console (Irvine)
    call   CRLF                 ; New line on console (Irvine)

    shl eax, 1                  ; Result from WideCharToMultiByte multiplied by 2 due to Unicode
    add esi, eax                ; *szArglist += eax
    sub dword ptr [nArgs], 1    ; Further arguments in the list?
    jnz @B                      ; yes -> once more

    invoke LocalFree, dword ptr [szArglist] ; Free the memory occupied by CommandLineToArgvW

    @@exit:
    exit                        ; Irvine's exit

main ENDP

END main
我建议用空格分隔数组的元素:


Program.exe“32字节数组(固定大小)”1 2 3 4 5

您是否已经用另一种语言编写了此程序,并发现它太慢了?我用java完成了概念性工作,但目前还没有,基本上我使用的是加密算法,主程序将使用此汇编程序作为外部应用程序,以更快地处理数据,然后将其返回主应用程序。主应用程序将执行此操作并等待响应,而不是自行处理数据。不幸的是,我知道的Java比ASM多得多,但使用它将帮助我更加精通Java。这取决于您为之编程的操作系统。请至少告诉我们.MODEL指令,例如
.MODEL small
.MODEL flat
。MODEL flat,为32位处理器构建。386架构,虽然如果另一个模型工作得更好,我可以更改它,但我对该模型的实际功能了解不多,我的书倾向于使用flat(kip irvine,x86处理器汇编语言第七版)谢谢,我会在第二天左右调查此事,现在我有一大堆工作要完成,不过我会给你回复的。