Как узнать, имеет ли код сборки определенный синтаксис (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