【第十章】实验10

1.PNG

2.PNG

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

3.PNG

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