10、实验十
1、显示字符串
主要需解决的问题:字符串在显存中的地址定位
代码及注释如下:
;LAB10-1.asm
assume cs:code
data segment
db 'Welcome to masm!',0
data ends
code segment
start: mov dh,10 ;行
mov dl,15 ;列
mov cl,2 ;颜色
mov ax,data
mov ds,ax
mov si,0
call show_str
mov ax,4c00h
int 21h
show_str: push ax
push bx
push es
push si
mov ax,0b800h
mov es,ax
mov ax,160 ;一行160B
mul dh ;计算出(dh)行对应的显存起始地址,结果存放于ax中
mov bx,ax ;bx=ax=160*dh
mov ax,2
mul dl ;计算(dl)列对应的显存单元地址,ax=dl*2
add bx,ax ;mov bx, (160*dh + dl*2)设置es:bx指向显存首地址
mov al,cl ;把颜色cl赋值al
mov cl,0
s0: mov ch,[si] ;待显示的源数据
jcxz s1 ;(ds:si)=0时,转到show1执行
mov es:[bx],ch ;显示字符
mov es:[bx].1,al ;显示字符颜色
inc si ;ds:si指向下一个字符地址
add bx,2 ;es:bx指向下一个显存地址
jmp s0
s1: pop si
pop es
pop bx
pop ax
ret
code ends
end start
运行结果
2、解决除法溢出的问题
没看懂
https://blog.csdn.net/Skies_/article/details/122230794
https://blog.csdn.net/shaco_/article/details/105472170
https://blog.csdn.net/qq_60829702/article/details/123582250
3、数值显示
assume cs:code
data segment
db 10 dup (0)
data ends
code segment
start: ;mov ax,317ah ;12666
mov ax,64h ;100
mov bx,data
mov ds,bx
mov si,0
call dtoc
mov dh,8h ;行号
mov dl,3h ;列号
mov cl,2h ;颜色
call show_str
mov ax,4c00h
int 21h
dtoc: mov bx,0ah ;将16位除数放在bx中,32位/16位
mov dx,0 ;DX为被除数的高16位,低16位为AX
div bx
mov cx,ax ;将商赋给cx来判断算法是否结束
add dx,30h ;DX存放余数+30H正好对应数字的ASCII值
mov [si],dl ;将所得余数存放在data段中(逆序存放)
inc si
jcxz okk ;判断是否结束
jmp short dtoc ;如果没结束就继续
okk: ret
show_str:
sub dh,1h
mov al,dh
mov bl,0a0h ;一行160B
mul bl ;bl存放的为显示字符在显存中第一行地址
mov di,ax
add di,4h
mov ax,0b800h
mov es,ax
mov ah,cl
s: mov cl,-1[si] ;-1[si]=[-1+si],注意汇编语言中不能[si-1]
mov ch,0
mov al,cl
mov es:[di],ax
sub si,1
mov cx,si
jcxz ok ;以si是否为0来判断是否结束(注意jcxz只能判断cx的值我这里写si是更好理解结束的位置)
add di,2
jmp short s
ok: ret
code ends
end start