Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 如何知道汇编代码是否具有特定语法(emu8086、NASM、TASM等)?_Assembly_X86_Tasm_Att_Intel Syntax - Fatal编程技术网

Assembly 如何知道汇编代码是否具有特定语法(emu8086、NASM、TASM等)?

Assembly 如何知道汇编代码是否具有特定语法(emu8086、NASM、TASM等)?,assembly,x86,tasm,att,intel-syntax,Assembly,X86,Tasm,Att,Intel Syntax,我想知道,通过查看示例源代码,如何识别使用的语法是em8086、TASM还是NASM?我是汇编新手。我想了解更多有关emu8086的信息。首先:他们都是采用英特尔语法的x86汇编程序,所以。。。指令的语法相同;他们也应该使用相同的助记符 你应该知道它们的语法 相关的: 指令可能有所不同。以下是NASM指令的一些示例: 位32 位16 ORGsection 在这里,您应该找到所有nasm关键字(并非该列表中的所有元素都是nasm关键字): 我认为emu8086使用FASM,NASM/YASM

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

首先:他们都是采用英特尔语法的x86汇编程序,所以。。。指令的语法相同;他们也应该使用相同的助记符

你应该知道它们的语法

相关的:

指令可能有所不同。以下是NASM指令的一些示例:

  • 位32
  • 位16
  • ORG
    section
在这里,您应该找到所有nasm关键字(并非该列表中的所有元素都是nasm关键字):


我认为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
请注意此处标签名称后的
,即使对于数据也是如此。这是推荐的,但不是必需的:行首的任何未知标记都假定为标签,因此
计数器resd 1
将进行组装。但是
loop resd 1
不会,因为
loop
是有效的指令助记符

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

GNU GAS
。英特尔&u语法noprefix
基本相同,但没有标签的魔术操作数大小关联。GAS指令/伪指令完全不同,比如
.byte 0x12
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的标志

e、 g.如果您曾经看到一个裸符号作为目标操作数(例如,
mov-foo,eax
),那么它肯定不是NASM,因为
mov-imm32,r32
毫无意义除非符号实际上是寄存器的宏定义,例如,
%define result eax
将允许
mov result,5
。(). 如果源代码中充满宏,则查找def
%define
表示NASM,而
MACRO
表示MASM/TASM

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

重复字节
0x10
30次。你可以在任何东西上使用它,甚至是在说明书上。它还具有重复块的
%rep
指令

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

TagWiki有指向汇编程序手册和更多内容的链接


使用错误的汇编程序汇编代码时的其他随机事件: 在MASM中,
dword
本身(不是dword ptr)计算为数字
4
,因为这是dword的宽度。因此,
mov-dword[foo],123
将灾难性地组合为
mov-4[foo],123
,这与
[foo+4]
相同。操作数大小将是您如何声明
foo
所暗示的任何大小,例如
foodb1,2,3,4
是一个字节数组,因此由MASM组装的
mov dword[foo],123
实际上是
mov byte ptr:foo,123


另请参见MASM语法设计的灾难
mov eax,[const]
是一个mov立即数,如果
const
被声明为
const=0xb8000

大多数有效的emu8086程序都是有效的TASM程序,所以很难区分这两个程序。@那么你的意思是说,如果我用emu8086编写源代码,它将与TASM兼容?而TASM在很大程度上与MASM兼容,实际上,如果配置为这样,它几乎可以编译所有的文件(但它也有自己的“TASM理想模式”,这是MASM的一个更干净的版本(更干净的英特尔语法),但不会在MASM下编译。NASM有一些TASM兼容性命令行开关,IIRC只适用于大多数基本源代码,所以不用麻烦了。YASM应该编译NASM的几乎所有内容(可能除了一些高级宏)。Emu8086是“噱头”MASM/TASM,基本示例将起作用。此外,emu8086最不严格=怪异源代码通常编译为something=bug。在某些情况下,如果源代码不使用特定于特定汇编器的任何东西,则通过查看源代码来识别它们之间的差异几乎是不可能的。您通常可以识别16位代码与32位代码与64位代码(特别是如果足够长),但即使在16b实模式下也可能使用32b指令,因此再次可能会变得棘手。当然,最简单的方法是检查作者的文档,任何合适的源代码通常都有文档说明它是如何构建的,使用了哪些工具+版本来开发它,以及源代码本身的合法许可证。而且每个操作系统API与c不同ourse.NASM和TASM使用相同的助记符,但内存操作数的操作数语法不同。(
dword
vs.
dword ptr
)。您不能只更改指令,将某些内容从TASM移植到NASM。