3

我想知道如何通过查看示例源代码来识别使用的语法是 em8086、TASM 还是 NASM?我是组装新手..我想了解更多关于emu8086的信息。

4

2 回答 2

4

NASM/YASM 很容易与 MASM/TASM/emu8086 区分开来。YASM 使用 NASM 语法,它接受的常量和指令有一些细微差别。

我不知道如何区分 MASM 与 TASM,或 TASM 与 emu8086 或 FASM,所以我将把它留给另一个答案来解决。


在 NASM 中,诸如内存操作数之类的明确大小使用dwordbyte. 在 TASM/MASM 风格中,你必须写dword ptror byte ptr

在 MASM(我认为是 TASM/emu8086)中,一个裸符号名称指的是内容。你必须使用offset foo来获取 foo 的地址。在 NASM 中,你必须使用[foo]来创建内存操作数,并且foo是地址。

语法上可能还有其他差异(例如,在段覆盖中),但这些应该足以通过查看某个东西是 NASM 样式还是 MASM 样式来判断。

纳斯达克

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将被组装。但loop resd 1不会因为loop是有效的指令助记符。

MASM/TASM(我可能有一些错误,我不使用 MASM 或 TASM):

GNU GAS.intel_syntax noprefix基本相同,但没有标签的神奇操作数大小关联。和 GAS 指令/伪指令完全不同,比如.byte 0x12vs. 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. (很好,@MichaelPetch)。如果源中充满了宏,则查找 defs。 %define表示 NASM,而MACRO表示 MASM/TASM。

MASM/TASM 没有resb/resd指令。相反,他们有count DUP(value),其中价值可以是?

NASM 必须times 30 db 0x10重复该字节0x1030 次。你可以在任何东西上使用它,甚至是指令。它还具有%rep重复块的指令。

MASM 和 NASM 具有重要的宏功能,但它们使用不同的语法。

标记 wiki 包含指向汇编器手册等的链接。


使用错误的汇编器汇编代码时的其他随机事件:

在 MASM 中,dword它本身(不是 dword ptr)评估为 number 4,因为那是 dword 的宽度。所以mov dword [foo], 123会惨不忍睹地组装成mov 4[foo], 123哪一样[foo+4]。并且操作数大小将是您声明的方式所暗示的任何大小foo,例如foo db 1,2,3,4是一个字节数组,因此mov dword [foo], 123由 MASM 组装实际上是mov byte ptr:foo, 123.

有关MASM 语法设计的灾难, 另请参阅MASM32 中的混淆括号。mov eax, [const]是一个 mov-immediate ifconst被声明为const=0xb8000.

于 2017-07-01T00:48:11.090 回答
0

第一:它们都是具有 intel 语法的 x86 汇编程序,所以......指令的语法是相同的;他们也应该使用相同的助记符。

您应该知道所有这些的语法。

相关:TASM和MASM的组装区别

指令可以不同。这些是 NASM 指令的一些示例:

  • BITS 32
  • BITS 16
  • ORG分割

在这里您应该找到所有 nasm 关键字(并非该列表的所有元素都是 nasm 关键字): http: //www.nasm.us/doc/nasmdoci.html

我认为emu8086使用FASM

于 2017-06-30T19:56:10.280 回答