.IF和CMP之间的差异? INVOKE和PUSH&CALL? ?使用哪一个(MASM)在MASM
,你有IF,而中,调用等,这在其他装配像NASM或TASM:.IF和CMP之间的差异? INVOKE和PUSH&CALL? ?使用哪一个(MASM)在MASM
IF
= CMP
,INVOKE
= push
参数和call
功能,循环(如WHILE
)= CMP
和JMP
到LABELS
,等等....
所以我不明白,如果我在MASM写IF
,它tanslated到CMP
当我编译程序(组装&链接)?环路被翻译成CMP
和JMP
到一些LABLES
? INVOKE
被翻译成push
参数和call
的功能?基本上我问什么,如果即时通讯使用IF
WHILE
INVOKE
等,他们翻译到这里写的是什么: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等。 这是我唯一需要停止做的事情吗?
如果我的写作在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生成的内容。
是的,它们是汇编程序的高级构造('invoke'是一个宏),它们将被转换成适当的汇编代码。 – Jester