8.1
《汇编语言(第3版)》8.1、《零基础入门学习汇编语言》P38
第八章 数据处理的两个基本问题
为了描述上的简洁,我们将使用两个描述性的符号 reg 来表示一个寄存器,用 sreg 表示一个段寄存器
- reg 的集合包括:ax、bx、cx、dx、ah、al、bh、bl、ch、cl、dh、dl、sp、bp、si、di;
- sreg 的集合包括:ds、ss、cs、es。
8.1 bx、si、di、bp
在 8086 CPU 中,只有这 4 个寄存器(bx、bp、si、di)可以用在“[…]”中来进行内存单元的寻址。
正确的指令
- mov ax,[bx]
- mov ax,[bx+si]
- mov ax,[bx+di]
- mov ax,[bp]
- mov ax,[bp+si]
- mov ax,[bp+di]
错误的指令:mov ax,[cx]、mov ax,[ax]、mov ax,[dx]、mov ax,[ds]
在“[…]”中,这 4 个寄存器(bx、bp、si、di)可以单个出现,或只能以四种组合出现
- bx 和 si
- bx 和 di
- bp 和 si
- bp 和 di
错误的用法:mov ax,[bx+bp]、mov ax,[si+di]
正确的用法
- mov ax,[bx]
- mov ax,[si]
- mov ax,[di]
- mov ax,[bp]
- mov ax,[bx+si]
- mov ax,[bx+di]
- mov ax,[bp+si]
- mov ax,[bp+di]
- mov ax,[bx+si+idata]
- mov ax,[bx+di+idata]
- mov ax,[bp+si+idata]
- mov ax,[bp+di+idata]
只要在 […] 中使用寄存器 bp,而指令中没有显性的给出段地址,段地址就默认在 ss 中。比如
指令 | 含义 |
---|---|
mov ax,[bp] | (ax)=((ss)×16+(bp)) |
mov ax,[bp+idata] | (ax)=((ss)×16+(bp)+idata) |
mov ax,[bp+si] | (ax)=((ss)×16+(bp)+(si)) |
mov ax,[bp+si+idata] | (ax)=((ss)×16+(bp)+(si)+idata) |
8.2 机器指令处理的数据所在的位置
绝大部分机器指令都是进行数据处理的指令,处理大致可分为三类:读取、写入、运算
在机器指令这一层来讲,并不关心数据的值是多少,而关心指令执行的前一刻,它将要处理的数据所在的位置。
指令在执行前,所要处理的数据可以在三个地方:CPU 内部、内存、端口
机器码 | 汇编指令 | 指令执行前数据的位置 |
---|---|---|
8E1E0000 | mov bx,[0] | 内存,ds:0 单元 |
89C3 | mov bx,ax | CPU 内部,ax 寄存器 |
BB0100 | mov bx,1 | CPU 内部,指令缓存器 |
8.3 汇编语言中数据位置的表达
汇编语言中用三个概念来表达数据的位置
- 立即数(idata) 对于直接包含在机器指令中的数据(执行前在 CPU 的指令缓存器中),在汇编语言中称为:立即数(idata),在汇编指令中直接给出。例如:mov ax,1,对应机器码:B80100,执行结果:(ax)=1
- 寄存器 指令要处理的数据在寄存器中,在汇编指令中给出相应的寄存器名。例如:mov ax,bx,对应机器码:89D8,执行结果:(ax)=(bx)
- 段地址(SA)和偏移地址(EA)
指令要处理的数据在内存中,在汇编指令中可用 [X] 的格式给出 EA,SA 在某个段寄存器中。
- 存放段地址的寄存器可以是默认的。
示例(段地址默认在 ss 中!)
- mov ax,[0](此处只能是 0,表示没有偏移地址,如改为其它数字均报错)
- mov ax,[bx]
- mov ax,[bx+8]
- mov ax,[bx+si]
- mov ax,[bx+si+8]
- mov ax,[bp]
- mov ax,[bp+8]
- mov ax,[bp+si]
- mov ax,[bp+si+8]
- 存放段地址的寄存器也可以是显性的给出。 示例
- 存放段地址的寄存器可以是默认的。
示例(段地址默认在 ss 中!)
指令 | 含义 |
---|---|
mov ax,ds:[bp] | (ax)=((ds)×16+(bp)) |
mov ax,es:[bx] | (ax)=((es)×16+(bx)) |
mov ax,ss:[bx+si] | (ax)=((ss)×16+(bx)+(si)) |
mov ax,cs:[bx+si+8] | (ax)=((cs)×16+(bx)+(si)+8) |
8.4 寻址方式
当数据存放在内存中的时候,我们可以用多种方式来给定这个内存单元的偏移地址,这种定位内存单元的方法一般被称为寻址方式。
8086 CPU 多种寻址方式小结
