语句种类:
空行;赋值语句;伪操作符语句和及其指令语句。其中,伪操作符语句是汇编器使用的指示符,通常不会产生任何代码,它由伪操作码和任意多个操作数组成。机器指令语句是可执行机器指令的助记符,一条汇编语句通常包含标号(可选)+指令名称+操作数。汇编语言产生的目标文件,通常包含三个段或者区(section),正文段(.text),数据段(.data)和未初始化数据段(.bss)。
直接寄存器寻址:
mov bx,ax
jmp bx
间接寄存器寻址:
mov【bx】,ax
jmp【bx】
立即数寻址
movax,#1234
movax,#msg1
绝对寻址:
movax,1234
movax,msg1
索引寻址:
movax,msg1【bx】
字符串变量:msg1:.ascii“ Loading System...”
字符: .byte13,10
双字: .word 0xAA55
jmpi:go,BOOTSEG
段间跳转指令,跳转到BOOTSEG:go这个位置,这个指令将会隐式改变CS和IP
.ORG,在汇编语言中是一条指令。其作用是告诉汇编程序,在开始执行的时候,将某段机器语言装载到内存中的哪个地址。如果没有它,有些指令就不能正确地翻译和执行。
GNUas汇编
as汇编使用AT&T系统V的汇编语法,于intel汇编程序使用的语法不一样。
1)立即数寻址要用“$”;寄存器操作数之前要用“%”,绝对跳转和调用要加“*”
2)操作数顺序是从左到右“源,目的”
3)内存操作数的长度由操作码的最后一个字符来确定
4)AT&T语法立即形式的远程跳转和调用是limp/lcall$section,$offset;intel对应的位jmp/callfar section:offset同样,AT&T语法中远程返回指令是lret$stack-adjust
5)AT&T汇编器不提供对多代码程序的支持,UNIX类操作系统要求所有代码在一个段中。
大部分和intel语法相同,但是转换指令不同,对比如下
AT&T |
Intel |
说明 |
Cbtw |
Cbw |
把%al中的字节值符号扩展到%ax中 |
Cwtl |
Cwde |
把%ax符号扩展到%eax中 |
Cwtd |
Cwd |
把%ax符号扩展到%dx:%eax中 |
Cltd |
Cdq |
把%eax符号扩展到%edx:%eax中 |
指令操作码前缀用于修饰随后的操作码,通常用于重复字符串指令/提供区域覆盖/执行总线锁定/指定操作数和地址宽度。
操作码前缀 |
说明 |
cs,ds,ss,es,fs,gs |
区覆盖操作码前缀,内存引用形式会自动添加这种前缀 |
data16,addr16 |
操作数/地址宽度前缀 |
Lock |
总线锁存前缀 |
Wait |
协处理器指令前缀 |
rep,repe,repne |
串指令操作前缀 ,使得船只领重复执行%ecx中指定的次数 |
待续
JMP是无条件跳转指令,可分为直接跳转和间接跳转,条件跳转只有直接跳转一种形式。对于直接跳转;对于间接跳转,跳转的目的位置来自于某个寄存器或者内存位置。直接跳转的写法是给出跳转目标处的标号;间接跳转语句的语法必须使用“*”作为前缀字符。