| 
 | 
 
 
 楼主 |
发表于 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
 
  复制代码 |   
 
 
 
 |