Как узнать, имеет ли код сборки определенный синтаксис (emu8086, NASM, TASM, ...)?

Я хочу знать, как, просматривая образец исходного кода, определить, используется ли синтаксис em8086, TASM или NASM? Я новичок в сборке.. Я хотел бы узнать больше о emu8086, пожалуйста.

2 ответа

Решение

NASM/YASM легко отличить от MASM/TASM/emu8086. YASM использует синтаксис NASM, с небольшими отличиями в том, что он принимает для констант и директив.

Я не знаю, как отличить MASM от TASM, или TASM от emu8086, или FASM, поэтому я оставлю это для другого ответа по адресу.


В NASM явные размеры для таких вещей, как использование операндов памяти dword или же byte, В стиле TASM/MASM, вы должны написать dword ptr или же byte ptr,

В MASM (и я думаю, TASM/emu8086) голое имя символа ссылается на содержимое. Вы должны использовать offset foo чтобы получить адрес Foo. В NASM вы должны использовать [foo] создать операнд памяти, и foo это адрес.

Возможно, есть и другие различия в синтаксисе (например, в переопределении сегментов), но их должно быть достаточно, чтобы определить, является ли что-то в стиле NASM или в стиле MASM.

NASM:

global foo
foo:         ; a function called foo()
    add    dword [ecx], 2
    add    dword [counter], 1   ; Error without "dword", because neither operand implies an operand-size for the instruction.  And the [] is required.
    mov    eax, [static_var]    ; Without [], it would be mov eax,imm32 with the address of the static_var
    ret

section .data
 static_var: dd 0xdeadbeef     ; NASM can use 0x... constant.  MASM only allows 0DEADBEEFh style

section .bss
 counter: resd 1    ; reserve space for one dword (initialized to zero)
 buf:     resb 256  ; reserve 256 bytes

MASM / TASM (у меня могут быть некоторые из этих ошибок, я не использую MASM или TASM):

.CODE
foo PROC      ; PROC/ENDP definitely means not NASM
    add    dword ptr [ecx], 2
    add    counter, 1            ; operand-size magically implied by the dd after the counter label.  [] is optional
    mov    eax, static_var       ; to get the address:  mov eax, OFFSET static_var
    ; mov  eax, [static_var]   is allowed, too, but the usual style is not to use [] around labels.
    ret
ENDP

.data       ; no SECTION directive, just .data directly

  static_var dd 0deadbeefH
    ; IDK if MASM/TASM allows a : after labels, but the usual style seems to be not to use them.
   ; In NASM they're not required but it's good practice and the recommended style.

.bss
  ; (In most OSes, the BSS is initialized to zero.  I assume MASM/TASM allows you to write dd 0 in the BSS, but I'm not sure)

 counter: dd 0        ; reserve space for one dword (zeroed)
 buf   db 256 dup(?)  ; reserve 256 bytes (uninitialized).

За исключением случаев, когда я комментировал иначе, любое из этих отличий является гарантированным признаком того, что это NASM/YASM или MASM / TASM / emu8086

например, если вы когда-либо видите пустой символ в качестве операнда назначения (например, mov foo, eax), это определенно не NASM, потому что mov imm32, r32 не имеет смысла. Если символ на самом деле не является макроопределением для регистра, например, %define result eax позволит mov result, 5, ( Хороший улов, @MichaelPetch). Если источник полон макросов, ищите определения. %define означает NASM, а MACRO означает MASM / TASM.

MASM / TASM не имеет resb / resd директивы. Вместо этого они имеют count DUP(value) где значение может быть ?,

NASM имеет times 30 db 0x10 повторить байт 0x10 30 раз Вы можете использовать его на чем угодно, даже на инструкциях. Он также имеет %rep указание повторить блок.

MASM и NASM имеют значительные макроэкономические возможности, но используют другой синтаксис.

Вики-тег x86 содержит ссылки на руководства по сборке и многое другое.

Первое: все они являются ассемблерами x86 с синтаксисом intel, поэтому... синтаксис инструкций одинаков; они также должны использовать ту же мнемонику.

Вы должны знать синтаксис всех из них.

связанные: разница в сборке между TASM и MASM

Директивы могут отличаться. Вот некоторые примеры директив NASM:

  • BITS 32
  • BITS 16
  • ORGсегмент

Здесь вы должны найти все ключевые слова nasm (не все элементы этого списка являются ключевыми словами nasm): http://www.nasm.us/doc/nasmdoci.html

Я думаю, что emu8086 использует FASM

Другие вопросы по тегам