寄存器
定义描述性符号:reg 和 sreg
reg 用来表示一个寄存器。
sreg用来表示一个段寄存器。
reg的集合包括:ax bx cx dx ah al bh bl ch cl dh dl sp bp si di
sreg的集合包括: ds ss cs es
bx si di 和 bp
1)在8086CPU中,只有这4个寄存器可以用在[…]中来进行内存单元的寻址。
正确:
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]
2)在[…]中,这4个寄存器可以单个出现,或只能以4种组合出现:
bx 和 si
bx 和 di
bp 和 si
bp 和 di
正确:
mov ax, [bx]
mov ax, [bp]
mov ax, [si]
mov ax, [di]
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]
错误:
mov ax, [bx + bp]
mov ax, [si + di]
3)只要在[…]中使用寄存器bp,而指令中没有显性地给出段地址,段地址就默认保存在ss中。
mov ax, [bp] 含义: (ax) = ((ss)*16 + (bp))
mov ax, [bp + idata] 含义: (ax) = ((ss)*16 + (bp) + idata)
mov ax, [bp + di] 含义: (ax) = ((ss)*16 + (bp) + (di))
mov ax, [bp + si + idata] 含义:(ax) = ((ss)*16 + (bp) + (si) + idata)
机器指令处理的数据在什么地方
绝大部分机器指令都是进行数据处理的指令,处理大致可分为3类:读取、写入、运算。
在机器指令这一层来讲,并不关心数据的值是多少,而是关心指令执行前一刻,它将要处理的数据所在的位置。
指令执行前,所要处理的数据可以在3个地方:CPU内部、内存、端口。
机器码 汇编指令 指令执行前的位置
8E1E0000 mov bx, [0] 内存,ds:0单元
89C3 mov bx, ax CPU内部,ax寄存器
BB0100 mov bx, 1 CPU内部,指令缓冲器
汇编语言中数据位置的表达
汇编语言中用3个概念来表达数据的位置。
1)立即数(idata)
对于直接包含在机器指令中的数据(执行前在CPU的指令缓冲器中),在汇编语言中称为:立即数(idata),在汇编指令中直接给出。
例:
mov ax, 1
add bx, 2000H
or bx, 00010000B
mov al, 'a'
2)寄存器
指令要处理的数据在寄存器中,在汇编指令中给出相应的寄存器名。
例:
mov ax, bx
mov ds, ax
push bx
mov ds:[0], bx
push ds
mov ss, ax
mov sp, ax
3)段地址(SA)和偏移地址(EA)
指令要处理的数据在内存中,在汇编指令中可用[X]的格式给出EA,SA在某个段寄存器中。
mov ax, [0]
mov ax, [di]
mov ax, [bx + 8]
mov ax, [bx + di]
mov ax, [bx + si + 8]
以上这些指令的段地址默认在ds中。
mov ax, [bp]
mov ax, [bp + 8]
mov ax, [bp + si]
mov ax, [bp + di + 8]
以上这些指令的段地址默认在ss中。
mov ax, ds:[bp]
mov ax, es:[bx]
mov ax, ss:[bx + si]
mov ax, cs:[bx + si + 8]
存放段地址的寄存器也可以是显性给出的。