如何知道汇编代码是否具有特定语法(emu8086、NASM、TASM、...)?
How to know if an assembly code has particular syntax (emu8086, NASM, TASM, ...)?
我想知道如何通过查看示例源代码来识别使用的语法是 em8086、TASM 还是 NASM?我是装配新手..我想了解更多关于emu8086的信息。
首先:它们都是具有intel语法的x86汇编器,所以...指令的语法是相同的;他们也应该使用相同的助记符。
你应该知道所有这些语法。
相关:Assembly difference between TASM and MASM
指令可能不同。这些是 NASM 指令的一些示例:
BITS 32
BITS 16
ORG
段
在这里您应该找到所有 nasm 关键字(并非该列表的所有元素都是 nasm 关键字):
http://www.nasm.us/doc/nasmdoci.html
我觉得emu8086用的是FASM
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]
mov eax, [static_array + ecx*4] ; Everything *must* be inside the []
mov esi, static_var ; mov esi,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
请注意此处标签名称后的 :
,即使是数据。这是推荐但不是必需的:行首的任何未知标记都被假定为标签,因此 counter resd 1
将 assemble。但是 loop resd 1
不会,因为 loop
是一个有效的指令助记符。
MASM/TASM(我可能有一些错误,我不使用 MASM 或 TASM):
GNU GAS .intel_syntax noprefix
大部分相同,但没有标签的神奇操作数大小关联。 GAS指令/伪指令是完全不同的,比如.byte 0x12
vs. db 12h
.
.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 ; mov eax, [static_var] is the same, and recommended by some for clarity
mov eax, static_array[ecx*4] ; [ static_array + ecx*4 ] is also allowed, but not required.
mov esi, OFFSET static_var ; mov esi,imm32 with the address.
ret
ENDP
.data ; no SECTION directive, just .data directly
static_var dd 0deadbeefH
;;; With a : after the name, it would be just a label, not a "variable" with a size associated.
.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
。 ()。如果源代码中充满了宏,则寻找 defs。 %define
表示 NASM,而 MACRO
表示 MASM/TASM。
MASM/TASM 没有 resb
/ resd
指令。相反,他们有 count DUP(value)
,其中值可以是 ?
.
NASM has times 30 db 0x10
重复字节 0x10
30 次。你可以在任何东西上使用它,甚至是说明。它还具有 %rep
指令来重复一个块。
MASM 和 NASM 具有重要的宏功能,但它们使用不同的语法。
x86 标签 wiki 有指向 assembler 手册等的链接。
使用错误 assembler:
组装代码时的其他随机事件
在 MASM 中,dword
本身(不是 dword ptr)计算为数字 4
,因为这是一个 dword 的宽度。所以 mov dword [foo], 123
将灾难性地 assemble 和 mov 4[foo], 123
一样,这与 [foo+4]
相同。并且操作数大小将是您声明 foo
的方式所暗示的任何大小,例如foo db 1,2,3,4
是一个字节数组,所以 MASM 的 mov dword [foo], 123
assembled 实际上是 mov byte ptr:foo, 123
.
另请参阅 Confusing brackets in MASM32 了解 MASM 语法设计的灾难。如果 const
声明为 const=0xb8000
.
,则 mov eax, [const]
是立即移动
我想知道如何通过查看示例源代码来识别使用的语法是 em8086、TASM 还是 NASM?我是装配新手..我想了解更多关于emu8086的信息。
首先:它们都是具有intel语法的x86汇编器,所以...指令的语法是相同的;他们也应该使用相同的助记符。
你应该知道所有这些语法。
相关:Assembly difference between TASM and MASM
指令可能不同。这些是 NASM 指令的一些示例:
BITS 32
BITS 16
ORG
段
在这里您应该找到所有 nasm 关键字(并非该列表的所有元素都是 nasm 关键字): http://www.nasm.us/doc/nasmdoci.html
我觉得emu8086用的是FASM
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]
mov eax, [static_array + ecx*4] ; Everything *must* be inside the []
mov esi, static_var ; mov esi,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
请注意此处标签名称后的 :
,即使是数据。这是推荐但不是必需的:行首的任何未知标记都被假定为标签,因此 counter resd 1
将 assemble。但是 loop resd 1
不会,因为 loop
是一个有效的指令助记符。
MASM/TASM(我可能有一些错误,我不使用 MASM 或 TASM):
GNU GAS .intel_syntax noprefix
大部分相同,但没有标签的神奇操作数大小关联。 GAS指令/伪指令是完全不同的,比如.byte 0x12
vs. db 12h
.
.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 ; mov eax, [static_var] is the same, and recommended by some for clarity
mov eax, static_array[ecx*4] ; [ static_array + ecx*4 ] is also allowed, but not required.
mov esi, OFFSET static_var ; mov esi,imm32 with the address.
ret
ENDP
.data ; no SECTION directive, just .data directly
static_var dd 0deadbeefH
;;; With a : after the name, it would be just a label, not a "variable" with a size associated.
.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
。 (%define
表示 NASM,而 MACRO
表示 MASM/TASM。
MASM/TASM 没有 resb
/ resd
指令。相反,他们有 count DUP(value)
,其中值可以是 ?
.
NASM has times 30 db 0x10
重复字节 0x10
30 次。你可以在任何东西上使用它,甚至是说明。它还具有 %rep
指令来重复一个块。
MASM 和 NASM 具有重要的宏功能,但它们使用不同的语法。
x86 标签 wiki 有指向 assembler 手册等的链接。
使用错误 assembler:
组装代码时的其他随机事件在 MASM 中,dword
本身(不是 dword ptr)计算为数字 4
,因为这是一个 dword 的宽度。所以 mov dword [foo], 123
将灾难性地 assemble 和 mov 4[foo], 123
一样,这与 [foo+4]
相同。并且操作数大小将是您声明 foo
的方式所暗示的任何大小,例如foo db 1,2,3,4
是一个字节数组,所以 MASM 的 mov dword [foo], 123
assembled 实际上是 mov byte ptr:foo, 123
.
另请参阅 Confusing brackets in MASM32 了解 MASM 语法设计的灾难。如果 const
声明为 const=0xb8000
.
mov eax, [const]
是立即移动