如何知道一个汇编代码具有特定的语法(emu8086,NASM,TASM,...)?

问题描述 投票:1回答:2

我想知道如何,通过一个示例源代码看,如果承认使用的语法是em8086,TASM或NASM?我是新来assembly..I想知道更多关于emu8086请。

assembly x86 tasm att intel-syntax
2个回答
2
投票

NASM / YASM是容易从MASM / TASM / emu8086进行区分。 YASM使用NASM语法,在它接受常量和指令的一些细微的差别。

我不知道如何从TASM或TASM从emu8086,或FASM区分MASM,所以我会留到另答案地址。


在NASM,对事物如内存操作数显式大小使用dwordbyte。在TASM / MASM风格,你必须写dword ptrbyte ptr

在MASM(我认为TASM / emu8086),裸露的符号名referes的内容。你必须使用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将装配。但loop resd 1不会因为loop是一个有效的指令助记符。

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

GNU GAS .intel_syntax noprefix大多是相同的,但没有魔法数大小协会的标签。和天然气指令/伪指令是完全不同的,像.byte 0x12db 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。 (Good catch, @MichaelPetch)。如果来源是全宏,然后查找DEFS。 %define装置NASM,而MACRO意味着MASM / TASM。

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

NASM has times 30 db 0x10重复字节0x10 30倍。你可以用它在任何东西,甚至说明。它也有%rep指令重复块。

MASM和NASM有显著微距功能,但它们使用不同的语法。

标签wiki有链接汇编手册等等。


0
投票

首先:他们都是采用Intel语法,因此86装配...指令的语法是相同的;他们也应该使用同样的记忆。

你应该知道所有的人的语法。

相关:Assembly difference between TASM and MASM

该指令可以是不同的。这些都是NASM指令的一些例子:

  • BITS 32
  • BITS 16
  • ORGsegment

在这里,你会发现所有的NASM关键字(不是列表的所有元素都NASM关键字):http://www.nasm.us/doc/nasmdoci.html

我认为emu8086使用FASM

© www.soinside.com 2019 - 2024. All rights reserved.