Assembly 移动目的地,目的地(或)移动目的地,目的地?
MOV可能是每个人在学习ASM时学习的第一个指令 刚才我遇到一本书,上面写着:(断开的链接被删除) 但我知道它是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 dest,src
。它类似于“Loaddest
withsrc
”。甚至说同样的话
我不是说作者错了。我知道他是对的。但我在这里错过了什么
顺便说一句。。他正在使用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中所读到的,首先是指令opcode0F7h
,然后是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