|

楼主 |
发表于 2016-8-3 10:47:38
|
显示全部楼层
改进了程序,这次竟然忘记了将每次求得的余数转换为ASCII码,汗!!!显示为乱码
辛苦的每步debug-t才发现。- assume cs:code
- data segment
- db 10 dup(0) ;16B,准备放置屏幕要显示的内容
- data ends
- stack segment
- dw 16 dup(0) ;32B
- stack ends
- code segment
- start:
- mov ax,stack
- mov ss,ax
- mov sp,32
- mov ax,data
- mov ds,ax ;初始给定的十进制值及颜色值的存放位置
- mov si,0
- mov di,0
- mov ax,12666 ;初始给定的word型数据<65536,最大5位数
- call dtoc_4bdiv2b
- mov dh,8 ;给定显示的位置及颜色要求:8行3列、绿色
- mov dl,3
- mov cl,2
- call show_str
- mov ax,4c00h
- int 21h
- ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
- show_str:
- ;参数:行=dh,列=dl,颜色值=cl
- ;返回值:将内存中的ASCII码内容显示出来
- ;此子程序要求给定值在相应的寄存器中:行=dh,列=dl,颜色值=cl
- ;此程序要求栈段的长度为32B
- push ds
- push es
- push si
- push di
- push ax
- push bx
- push cx
- push dx
-
- ;求目标地址
- mov ax,0b800h
- mov es,ax
- mov di,0
-
- mov ax,0
- mov al,160
- dec dh ;从0行开始计数
- add dh,2 ;显存从第3行开始显示
- mul dh
- add di,ax
- mov ax,0
- mov al,2
- dec dl
- mul dl
- add di,ax
- mov ah,cl
- mov cx,0 ;清空cx的值
- ;向目标地址写入数据
- show_str_s:
- mov cl,ds:[si]
- jcxz show_str_ok
- mov al,ds:[si]
- mov es:[di],al
- mov es:[di+1],ah
- inc si
- add di,2
- jmp show_str_s
- show_str_ok:
- pop dx
- pop cx
- pop bx
- pop ax
- pop di
- pop si
- pop es
- pop ds
- ret
- ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
- dtoc_4bdiv2b:
- ;参数:数据由ax给出
- ;返回值:转换为10进制数的ASCII码存放在内存ds:0处,正常顺序存放
- ;此子程序要求被除数最大为32位,除数最大为16位,直接按照16位除数进行运算
- ;此程序要求栈段的长度为32B
- push ax
- push bx
- push cx
- push dx
- push si
- mov di,0
- dtoc_4bdiv2b_s:
- mov dx,0 ;被除数、除数最大16位,不会溢出,直接div即可
- mov bx,10
- div bx
- add dx,30h ;余数在dx中,实际只会在dl中,dh为0
- push dx ;切勿忘记+30h,转换为ASCII码
- inc di ;计数1次
- mov cx,ax
- jcxz dtoc_4bdiv2b_s2
- jmp short dtoc_4bdiv2b_s
- dtoc_4bdiv2b_s2:
- mov cx,di ;将计数转入cx进行loop循环
- dtoc_4bdiv2b_s1:
- pop ax
- mov ds:[si],al
- inc si
- loop dtoc_4bdiv2b_s1
- dtoc_4bdiv2b_ok:
- pop si
- pop dx
- pop cx
- pop bx
- pop ax
- ret
-
- ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
- dtoc_2bdiv1b:
- ;参数:ax给出被除数
- ;返回值:转换结果存在ds:[si]中,逆序存放
- ;此子程序要求给定16位被除数在寄存器ax中,除数为8位=10
- ;此程序要求栈段的长度为32B
- push ax
- push bx
- push cx
- push dx
- push si
-
- mov dx,10 ;设定除数
- mov bx,ax
- dtoc_2bdiv1b_s:
- mov ah,0
- mov al,bh
- div dl
- mov ch,al
- mov al,bl
- div dl
- mov cl,al
- add ah,30h
- mov ds:[si],ah ;余数写入内存ds:[si]中
- jcxz dtoc_2bdiv1b_ok
- inc si
- mov bx,cx
- jmp dtoc_2bdiv1b_s
-
-
- dtoc_2bdiv1b_ok:
- pop si
- pop dx
- pop cx
- pop bx
- pop ax
- ret
- code ends
- end start
复制代码 |
|