.IF和CMP之间的差异? INVOKE和PUSH&CALL? ?使用哪一个(MASM)在MASM

问题描述:

,你有IF,而中,调用等,这在其他装配像NASM或TASM:.IF和CMP之间的差异? INVOKE和PUSH&CALL? ?使用哪一个(MASM)在MASM

IF = CMPINVOKE = push参数和call功能,循环(如WHILE)= CMPJMPLABELS,等等....

所以我不明白,如果我在MASM写IF,它tanslated到CMP当我编译程序(组装&链接)?环路被翻译成CMPJMP到一些LABLESINVOKE被翻译成push参数和call的功能?基本上我问什么,如果即时通讯使用IFWHILEINVOKE等,他们翻译到这里写的是什么:https://en.wikipedia.org/wiki/X86_instruction_listings或他们编译像这些基本命令。

因为例如,我写了一个简单的聊天,这是插座部分:

 invoke socket,AF_INET,SOCK_STREAM,IPPROTO_TCP 
     .IF eax==INVALID_SOCKET 
      invoke crt_printf,offset Socketerror,offset formatMessagePRINT 
      WSAGetLastErrorMACRO 
      jmp End_Program 
     .else 
      mov [ListenSocket],eax 
      invoke crt_printf,offset SocketSuccess,offset formatMessagePRINT 
     .ENDIF 

正如你所看到的,它看起来就像是写在高级编程语言代码。这不是我想要的。我想在可编写的最低级别编写汇编程序。

那么如何在32位组装中写入最低级别的可写入? 我是否需要使用16位程序集(https://en.wikipedia.org/wiki/X86_instruction_listings) 的基本命令来编写,而不是IF WHILE INVOKE等。 这是我唯一需要停止做的事情吗?

+0

是的,它们是汇编程序的高级构造('invoke'是一个宏),它们将被转换成适当的汇编代码。 – Jester

如果我的写作在MASM,它tanslated到CMP时,我构建 程序(汇编&链接)?

是。例如:

.IF ax==1 
    MOV bx,2 
.ELSE 
    MOV bx,0 
    MOV cx,2 
.ENDIF 

装配到:

00401006 CMP AX,1 
0040100A JNZ SHORT 00401012 
0040100C MOV BX,2 
00401010 JMP SHORT 0040101A 
00401012 MOV BX,0 
00401016 MOV CX,2 

那些高层次的结构来这里是为了帮助大小和可读性当程序变得复杂。

该调用部分也被转换为CALL和PUSH,并且这个宏在您提到的聊天等复杂程序中派上用场。

但是,使用该高级汇编语法将使代码难以移植到另一个汇编程序,因为只有MASM使用它。

那么如何在32位BIT汇编中编写最低级别,可以编写为 ?

只要写简单的程序集? MASM不会强制您使用.IF和INVOKE。 有大量的教程解释如何做到这一点。

您也可以编译您的聊天程序并对其进行反编译,以查看MASM生成的内容。