Различия между .IF и CMP? INVOKE и PUSH&CALL? Какой из них использовать? (MASM)

в MASM у вас есть IF,WHILE,INVOKE и т. д., которые в других ассемблерах, таких как NASM или TASM:

IF=CMP, INVOKE = push параметры и call функция, циклы (например, WHILE) = CMP и JMP до LABELS и так далее....

Так что я не понимаю, если я пишу IF в MASM, это преобразуется в 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 и т. д.? это единственное, что мне нужно перестать делать?


person Roy Kuper    schedule 04.10.2015    source источник
comment
Да, это высокоуровневые конструкции ассемблера (хотя invoke это макрос), они будут переведены в соответствующий ассемблерный код.   -  person Jester    schedule 04.10.2015


Ответы (1)


Если я пишу IF в MASM, он преобразуется в 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-битной ассемблере на самом низком уровне, на котором можно писать?

Просто написать простую сборку? MASM не заставляет вас использовать .IF и INVOKE. Есть множество руководств, которые объясняют, как это сделать.

В качестве альтернативы вы можете скомпилировать программу чата и декомпилировать ее, чтобы увидеть, что было сгенерировано MASM.

person gyc    schedule 06.10.2015