1.寄存器全称
以16位寄存器为例:
ax: accumulate register
bx: base register
cx: count register
dx: data register
cs: code segment
ds: data segment
ss: stack segment
ed: extra segment
(可能有扩展fs,gs)
ip: instruct pointer
sp: stack pointer
bp: base pointer
si: source index
di: destination index
psw: program state word
其实命名有一个规律:
- 8位 == extend ==> 16位: …+x,如
ax
- 16位 == extend ==> 32位: e+…+x,如
eax
- 32位 == extend ==> 64位: r+…+x,如
rax
2.psw常用标志位
of: overflow flag
df: direction flag
if: interrupt flag
tf: trap flag
sf: sign flag
zf: zero flag
af: auxiliary carray flag
pf: parity flag
cf: carry flag
3.寻址方式
at&t语法:
地址或偏移(%基址寄存器,%索引寄存器,比例因子)
地址 = 地址或偏移 + %基址寄存器 + 比例因子 * %索引寄存器(省略以0代替)
立即寻址
指令本身包含数据
# 将数字 1 存入 ax
mov $1, %ax
# 将寄存器 bx 中的值存入 ax
mov %bx, %ax
直接寻址
指令包含要访问的内容地址
# 将地址 1 指向的内容存入 ax
mov 1, %ax
间接寻址
指令中包含一个寄存器,该寄存器中存储的是指向要访问数据的指针
# 将寄存器 bx 中的值作为地址,将该地址指向的内容存入 ax
mov (%bx), %ax
基址寻址
这种方式与间接寻址类似,但还另外包括一个叫做偏移量的值,将其与寄存器中的值相加后再用于寻址
mov 4(%bx), %ax
变址寻址
指令中除包含一个要访问的内存地址外,还要指定一个变址奇存器,其中包含该地址的偏移量
索引寻址
mov 起始地址(, %索引寄存器, 字长), %ax
.section .data
.section .text
.global _start
_start:
movl $1, %eax
movl $1, %ebx
int $0x80
$ as exit.s -o exit.o
$ ld exit.o -o exit
$ ./exit
- older
- Newer