|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
按照王爽汇编第四版实验10
显存上面写内容
除法运算
这两个函数分开单独运行都很正常。
结合到一起以后直接运行就直接卡死了,我debug去走一遍,里面可以正常运行到int 21h
我不明白到底哪儿出问题了
- assume cs:code,ds:data
- data segment
- dw 12666,444,1,8,3,38
- db 30 dup(0)
- data ends
- code segment
- begin:
- mov ax,data
- mov ds,ax
- mov si,0
- mov bx,10
- mov cx,6
- mov di,16
- s1:
- call dtoc ;调用函数dtoc
- add si,2
- loop s1
- mov si,16 ;为调用函数show_str前做必要参数的初始化
- mov dh,2
- mov dl,3
- mov cl,2
- call show_str ;调用函数show_str
- mov ax,4c00h ;退出程序
- int 21h
- dtoc: ;进入函数dtoc,保存变量si,cx
- push si
- push cx
- mov ax,ds:[si] ;将需要运算的被除数放入ax
- mov si,0 ;si置0,作为压栈计数器
- instack: ;数内循环,将数据进制转为10进制每位数存入一个字节单元
- div bx ;除数(bx)=10
- add dx,30h ;余数(dx)=(dx)+30h为10进制每位数的ascii码
- push dx ;余数(dx)压栈
- inc si ;用si计算压栈次数
- mov dx,0
- mov cx,ax
- jcxz ok
- jmp instack
- ok:
- mov cx,si ;cx计算将要出栈的次数
- outstack:
- pop ds:[di]
- inc di
- loop outstack
- pop cx ;还原变量cx,si
- pop si
- ret ;函数dtoc返回
- show_str: ;进入函数show_str
- push cx
- mov ax,0B800H
- mov es,ax ;es为0B800h显存的段地址
- mov cx,2000 ;设定循环2000次,正好完整清屏
- mov al,0h
- mov di,0
- init: ;初始化清屏开始
- mov es:[di],al
- add di,2
- loop init
- mov al,80 ;计算应该从显存的哪一个地址开始存数据
- sub dh,1
- mul dh
- sub dl,1
- mov dh,0
- add ax,dx
- add ax,ax
- mov di,ax
- pop cx ;字体颜色存放进bl
- mov bl,cl
- s:
- mov ch,0
- mov cl,ds:[si] ;cl存放具体数据
- jcxz ok1 ;如果数据为00跳出
- mov es:[di],cl ;数据cl,颜色bl放进显存对应地址
- mov es:[di+1],bl
- inc si
- add di,2
- jmp s
- ok1:
- ret ;函数show_str返回
- code ends
- end begin
复制代码 |
|