boos

在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

原文地址:https://www.cnblogs.com/xiaodaxiaonao/p/7158749.html