2015-10-04 61 views
2

,你有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

回答

2

如果我的寫作在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生成的內容。