【第十章】实验10


assume cs:code,ds:data
data segment
dd 0FFFFFFFFh
dw 0Ah
data ends
code segment
start: mov ax,data
mov ds,ax
mov si,0
call divdw
mov ax,4c00h
int 21h
;进行不会产生溢出的除法运算,被除数为dword类型,除数为word型,结果为dword型
;将结果的高16位放入dx,低16位放入ax,余数放入cx
;将被除数分割成两部分:H高16位和L低16位。
;先取出H,将其做一个16位除法,然后入栈商和余数。
;再取出L,家上H余数的左移16位,做一个16位除法,然后取出栈中H的商,家上L的商
divdw: push ax
push bx
push cx
push dx
push si
;将被除数放入放入ax、dx中,除数放入cx中
mov ax,ds:[si]
mov dx,ds:2[si]
mov cx,ds:4[si]
;将低位、高位分别入栈
push ax
push dx
;弹出高位,将其补为双字型元素
pop ax
mov dx,0
;除以除数
div cx
;将商放入bx中
mov bx,ax
;出栈低位,加上H余数,然后补位16位除法
pop ax
div cx
;将余数放入cx
mov cx,dx
mov dx,bx
pop si
pop dx
pop cx
pop bx
pop ax
ret
code ends
end start

assume cs:code
data segment
db 'Welcome to masm!',0
data ends
code segment
start: mov dh,8 ;行号,范围在0~24
mov dl,4 ;列号,范围在0~79
mov cl,138 ;颜色
;初始化ds寄存器
mov ax,data
mov ds,ax
mov si,0 ;si指向字符串的首地址
call show_str
mov ax,4c00h
int 21h
show_str: ;用es段寄存器存放显存段地址B800h
mov ax,0b800h
mov es,ax
;用行号和列号求出偏移地址:偏移地址=行号*16+列号
;将行号放入al中,然后mul 10h(不能乘以随机数,所以要放入寄存器bh中)
;这时ax中存放行号的偏移地址,然后将dh变为0,add ax,dx得到完整的偏移地址
mov al,dh
mov bh,00A0h
mul bh
mov dh,0
add ax,dx
;到这里计算出偏移地址
mov di,ax
mov al,cl
loo: mov ch,0
mov cl,ds:[si]
jcxz short ok
mov es:[di],cl
mov es:1[di],al
inc si
add di,2
jmp short loo
ok: ret
code ends
end start