目录:https://blog.csdn.net/qq_43098197/article/details/12453240
计算机进行数据处理、运算,需要两个东西:
- 处理的数据在什么地方(地址)
- 要处理的数据有多长(数据类型)
bx、si、di、bp
[...]
灵活寻址中,只有这四个寄存器可以使用,其它的不行。
bx
的段寄存器默认使用 ds
。
bp
的段寄存器默认使用 ss
。
si
和 di
不能分为两个 8 位的寄存器。
机器指令处理的数据在什么地方
在机器指令这一层,并不关心数据的值是多少,而关心指令执行前一刻,它将要处理的数据所在的位置。
数据可以放在:CPU 内部、内存、端口。
汇编中数据位置的表达
立即数: 也就是常数,机器指令执行前放在 CPU 的指令缓冲器中。
mov ax, 1
add bx, 2000h
or bx, 00010000b
mov al, 'a'
寄存器: 要处理的数据在寄存器中。
mov ax, bx
push bx
mov ds:[0], bx
段地址(SA)和偏移地址(EA): 要处理的数据在内存中。
mov ax, [0]
mov ax, [bx] ;SA=DS
mov ax, ds:[bx]
mov ax, [bp] ;SA=SS
mov ax, ss:[bp]
寻址方式
指令要处理的数据长度
8086CPU 可以处理 byte 和 word 两种长度的数据。
通过寄存器指明要处理的数据长度:
; word
mov ax, 1
mov bx, ds:[0]
mov ds, ax
mov ds:[0], ax
inc ax
add ax, 1000
; byte
mov al, 1
mov al, bl
mov al, ds:[0]
mov ds:[0], al
inc al
add al, 100
使用操作符 X ptr 指明内存单元度:
; word
mov word ptr ds:[0], 1
; byte
mov byte ptr ds:[0], 1
其它方法: 有些指令默认访问的内存单元是字节单元或字单元,例如 push 就只进行字单元操作。
div 指令
除数: 有 8 位和 16 位两种,存储在一个寄存器或内存单元中。
被除数:
- 若除数为 8 位,被除数为 16 位,则将被除数放到
AX
中。 - 若除数为 16 位,被除数为 32 位,则将被除数放到
DX(高16位)
和AX(低16位)
中。
运算结果的存放:
- 若除数为 8 位,被除数为 16 位,则结果存放到
AX
中,其中AL
为商,AH
为余数。 - 若除数为 16 位,被除数为 32 位,则结果存放到
AX
和 DX 中,其中AX
为商,DX
为余数。
被除数 16 位,除数 8 位
assume cs:code, ds:data
data segment
db 3, 0, 0, 0, 0
data ends
code segment
main: mov ax, data
mov ds, ax
; your code...
mov ax, 4c00h
int 21h
code ends
end main
使用寄存器存储除数与被除数:
mov ax, 0010H ; 16位的被除数
mov bl, 03H ; 8 位的除数
div bl
将除数放到内存中:
mov ax, 16
div byte ptr ds:[0]
结果:
AX = 0105
AL(商) = 05H = 5
AH(余) = 01H = 1
被除数 32 位,除数 16 位
assume cs:code, ds:data
data segment
db 01H, 00H, 0A1H, 86H
db 100
data ends
code segment
main: mov ax, data
mov ds, ax
; your code...
mov ax, 4c00h
int 21h
code ends
end main
使用寄存器存储:
mov dx, 0001H ; 32位的高位
mov ax, 86A1H ; 32位的低位
mov bx, 100 ; 16位的除数
div bx
使用内存存储:
mov dx, ds:[0]
mov ax, ds:[2]
div word ptr ds:[4]
结果:
AX(商) = 03E8H = 1000
DX(余) = 0001H = 1
伪指令
dd
:定义 dword(double word) 型数据,32 位。
dup
:数据的重复。
-
数据类型
重复的次数 dup (要重复的数据) -
例子:
dp 3 dup (0) ; 0,0,0 db 3 dup (0, 1, 2) ; 0,1,2,0,1,2,0,1,2 db 3 dup ('ab', 'AB') ; abABabABabAB