Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.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 移动目的地,目的地(或)移动目的地,目的地?_Assembly_X86_Nasm_Masm_Gnu Assembler - Fatal编程技术网

Assembly 移动目的地,目的地(或)移动目的地,目的地?

Assembly 移动目的地,目的地(或)移动目的地,目的地?,assembly,x86,nasm,masm,gnu-assembler,Assembly,X86,Nasm,Masm,Gnu Assembler,MOV可能是每个人在学习ASM时学习的第一个指令 刚才我遇到一本书,上面写着:(断开的链接被删除) 但我知道它是MOV dest,src。它类似于“Loaddestwithsrc”。甚至说同样的话 我不是说作者错了。我知道他是对的。但我在这里错过了什么 顺便说一句。。他正在使用GCC的as来汇编这些指令。但这不应该改变指令语法,对吗?有两种不同类型的汇编语言语法-英特尔语法和AT&t语法。 您可以在上找到两者的比较 您的书可能使用AT&T语法,其中源操作数位于目标操作数之前。mov dest,s

MOV可能是每个人在学习ASM时学习的第一个指令

刚才我遇到一本书,上面写着:(断开的链接被删除)

但我知道它是
MOV dest,src
。它类似于“Load
dest
with
src
”。甚至说同样的话

我不是说作者错了。我知道他是对的。但我在这里错过了什么


顺便说一句。。他正在使用GCC的
as
来汇编这些指令。但这不应该改变指令语法,对吗?

有两种不同类型的汇编语言语法-英特尔语法和AT&t语法。 您可以在上找到两者的比较


您的书可能使用AT&T语法,其中源操作数位于目标操作数之前。

mov dest,src
称为。(例如,mov eax,123)

mov src,dest
称为。(例如,
mov$123,%eax


UNIX汇编器(包括GNU汇编器)使用AT&T语法,我所知道的所有其他x86汇编器都使用Intel语法。您可以阅读这些差异。

是的,as/gas使用的是使用src、dest顺序的AT&T语法。MASM、TASM、NASM等都使用“dest、src”顺序。事实上,AT&T语法不太适合英特尔处理器,而且(至少在IMO上)是一个几乎不可读的混乱。例如,<代码> MOVZX < /代码>特别糟糕。

< P>如Jerry Coffin的回答中所提到的,英特尔语法更适合X86体系结构的指令编码。作为我的调试器反汇编程序中的注释,“”,例如,考虑这个指令:

-a
1772:0100 test word [AA55], 1234
1772:0106
-u 100 l 1
1772:0100 F70655AA3412      test    word [AA55], 1234
-
正如您在操作码hexdump中所读到的,首先是指令opcode
0F7h
,然后是ModR/M字节
06h
,然后是小尾端偏移字
0AA55h
,最后是立即字
1234h
。英特尔语法与汇编源代码中的顺序相匹配。在AT&T语法中,这看起来像
>testw$0x1234,(0xAA55)
它将顺序与编码进行交换

另一个遵守英特尔语法顺序的例子是比较条件。例如,考虑这个序列:

cmp ax, 26
jae .label

如果
ax
大于或等于
26(在无符号比较中),这将跳转到
.label
。这个助记符只适用于
cmp dest,src
操作数顺序,它为
dest-=src

设置标志。我应该已经阅读了第一章的前言和第一段。我跳过了它们注意,GNU汇编程序默认使用AT&T语法,不是无条件的。你可以用<代码>切换到英特尔语法。IntLyScript NopRebug