参考资料:内联汇编资料
语法构成
AT&T汇编语言是由两部分构成:操作码和操作数
在AT&T中,寄存器前面要加上"%", 而在立即数前面需要加上"$", 在AT&T中,十六进制立即数前面需要加上"0x",
立即数
立即数是一个常量,可以写成十六进制(H),十进制(D),八进制(O),二进制(B)
例如:addl 0xFFH, %eax
立即数只能作为源操作数,不能放在目的操作数位置
寄存器操作数
寄存器操作数指操作数放在寄存器中,用来存放参加运算的数据或存放运算结果。
其中的寄存器包括段寄存器,控制寄存器,通用寄存器
段寄存器 (DS,SS,ES)
段寄存器是存放段地址的,要将段地址送入,必须以通用寄存器为中间桥梁,即通过通用寄存器将数据传送到DS,SS,ES段寄存器中
eg:将段地址:20000H送数据段寄存器中
movl 0x20000,%eax
movl %eax,DS
通过通用寄存器传送,不能直接将立即数传送到段寄存器中。为代码段CS不准用户干预,是由系统分配的
控制寄存器
控制寄存器包括:指令指针寄存器IP,EIP和标志寄存器FLAGS,控制寄存器也不能直接传送操作数
通用寄存器
通用寄存器可以装操作数
内存操作数
内存操作数是指操作数存放在内存中,其操作是往内存中写数或从内存中取操作数,CPU与内存打交道是通过内存地址完成的
eg:
movl 0x20000,%eax
movl %eax,(0x20000)
注意:
1.对于单操作数指令:操作数只能是寄存器操作数和内存操作数
2.对于双操作数指令:源操作数可以是寄存器操作数,内存操作数和立即数,目的操作数可 以是寄存器操作数和内存操作数。源操作数,目的操纵数,不能同时为内存操作数