|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 ck329054222 于 2014-4-15 17:18 编辑
我的问题是。下面的代码运行之后,只显示我设置的双字的后6位,第一位的1怎么也不显示。。。求大神找出问题所在。。
- assume cs:code
- data segment
- db 10 dup (0)
- data ends
- code segment
- start: mov ax,9f0ah
- mov dx,0fh
- mov bx,data
- mov ds,bx
- mov si,0
- call dtoc
- mov dh,8;行
- mov dl,3;列
- mov cl,2
- call show_str
- mov ax,4c00h
- int 21h
- dtoc:push si ;转换为ASCII码并存入数据段
- push ax
- push cx
- push dx
- s1:
- mov cx,10
- call divdw
- jcxz kk
- add cx,30H
- inc si
- push cx
- jmp short s1 ;每次取余数转换为ASCII码
- kk:
- add cx,30h
- push cx
- inc si;最后一个1除以10就跳到这里了,si并没有增加,最后一位1也不在栈里故补偿
- mov cx,si ;设置循环次数
- mov si,0
- s2:
- pop dx
- mov ds:[si],dx
- inc si
- loop s2 ;将ASCII码存入内存
- pop dx
- pop cx
- pop ax
- pop si
- ret
- show_str:push dx ;显示数据段内的字符
- push cx
- push bx
- push ax
- mov ax,0b800h
- mov es,ax
- mov al,0a0h
- mul dh
- mov bx,ax;ax中为第八行首字节的偏移地址
- mov al,2
- mul dl
- add bx,ax;显存第一个字母的偏移地址
- mov ah,cl
- mov ch,0
- s:
- mov cl,ds:[si]
- jcxz ok
- mov al,cl ;字符放入低八位
- mov es:[bx],ax
- inc si
- add bx,2
- jmp short s
- ok: pop ax
- pop bx
- pop cx
- pop dx
- ret
- divdw: ;双字除法
- push ax
- mov ax,dx;将高16位装入低16位
- mov dx,0;装换后,不会产生溢出
- div cx;高16位产生高位余数dx,商ax为需要返回的值余数dx
- mov bx,ax
- pop ax;还原低16位
- div cx;ax即为所需返回的商
- mov cx,dx;判断最后余是否为0。cx=0,jcxz跳转
- mov dx,bx
- ret
- code ends
- end start
复制代码
|
|