在8086处理器上,如果要用寄存器来提供偏移地址,只能使用BX,SI,DI,BP。
段寄存器:BX
段寄存器:SI
段寄存器:DI
段寄存器:BP
不能使用其他寄存器,比如SP、IP、AX、CX、DX。
这是一种硬性规定,说不上有什么特别的理由。
而且在设计8086处理器时,每个寄存器都有自己的特殊用途。
32位 | 16位 | 8位寄存器 |
EAX | AX=累加器 | AH AL |
ECX | CX=计数器 | CH CL |
EDX | DX=数据寄存器 | DH DL |
EBX | BX=DS段的数据偏移地址 | BH BL |
ESP | SP=栈顶指针 | |
EBP | BP=栈底指针 | |
ESI | SI=复制内存原始地址(movsb movsw) | |
EDI | DI=复制内存目标地址(movsb movsw) |
32位 | 16位 | 8位寄存器 |
EAX | AX | AH AL |
ECX | CX | CH CL |
EDX | DX | DH DL |
EBX | BX | BH BL |
ESP | SP | |
EBP | BP | |
ESI | SI | |
EDI | DI |
设计这些寄存器的人,希望我们能够按照不同的用途去使用它们。
inc
r8/r16/m8/m16
sub
123 除以 10 =12 余数为3
12 除以 10 =1 余数为2
1 除以 10 =0
余数为1
;两个数相加 计算结果输出到屏幕上。
;cs:0000 :ip:7c00 =07c00
;cs:07c0 :ip:0000
=07c00
jmp near mycode
number1:
dw 125
number2:
dw 200
;325 / 10 = 32 余数 5
;32 / 10 = 3 余数2
;3 / 10 =
0 余数3
;0 / 10 =0 余数为0
;0 / 10 =0 余数为0
mydata:
db
'R',0x7,'e',0x7,'s',0x7,'u',0x7,'l',0x7,'t',0x7,':',0x7
result:
db 0,0x7,0,0x7,0,0x7,0,0x7,0,0x7;因为十六位最大是ffff=65535,所以要五位
mycode:
mov ax,0x07c0
mov ds,ax
;初始化数据段寄存器
mov ax,0xb800
mov es,ax ;初始化显存段寄存器
;计算两个数相加之和
mov bx,number1
mov ax,word
[ds:bx]
mov bx,number2
add ax,word [ds:bx]
mov sp,10 ;被除数
mov cx,5
mov bx,result+8
calc:
mov dx,0 ; dx:ax / 16位寄存器
div sp;dx:ax / sp
= 商在AX中,余数在DX中。
add dl,0x30
mov byte [ds:bx],dl
sub bx,2
loop calc
show:
mov cx,(mycode-mydata)/2
mov di,0
mov
si,mydata
rep movsw
;movs word es:di ds:si
stop: jmp near stop
times 510-($-$$) db 0
dw
0xAA55