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