. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->CALL和RET指令
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  关于dword型数转换为十进制数的字符串的子程序,有一点小问题,望高手指点。  [已解决] 回复[ 3次 ]   点击[ 280次 ]  
hhxylijiajia
[帖 主]   [ 发表时间:2011-04-18 16:57 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:2
注册日期:2011-02-01 10:19
assume cs:code,ss:stack,ds:data
data segment
        db 16 dup(0)
data ends

stack segment
        db 16 dup(0)
stack ends
code segment
start:         mov ax,stack
        mov ss,ax
        mov sp,16
        mov ax,data
        mov ds,ax
        mov si,0

        mov ax,0cff5h
        mov dx,0ff1bh  ;十进制数为4280012789

        call dtoc      ;调用转换字符串子程序

        mov dh,8       ;设置显示字符串的位置及显示的颜色
        mov dl,3
        mov bp,0
        mov cl,10101100b
        mov ax,0
        call show_str  ;调用显示字符串的子程序
    

        mov ax,4c00h
        int 21h

dtoc:         push bx       
dtoc1:        mov cx,10     ;设除数

        call divdw     ;调用32位除法子程序
        add cx,30h     ;将余数转换为字符串形式

        mov [si],cl    ;将结果存入数据段中
        inc si

        mov cx,ax      ;判断字符串是否转换完毕
        jcxz ok

          jmp short dtoc1
  ok:          pop bx
        ret
divdw:  push bx     
        push ax     
        mov ax,dx   
        mov dx,0    
        div cx      
        mov bx,ax   
        pop ax     
        div cx      
        mov cx,dx   
        mov dx,bx   
        pop bx
        ret
show_str: 
        push bx    
        push cx 
        push si 
        push di 

        mov ax,0b800h  ;将显示区的段地址送入es段寄存器中 
        mov es,ax 
   
        mov ax,0a0h    ;显示的行   
        mul dh 
        mov bx,ax 
 
        mov ax,2        ;显示的列
        mul dl 
        mov di,ax 
        mov ah,cl       
s:         sub si,1   
        mov cl,[si]
        mov ch,0
        jcxz ok1
        mov al,[si]
        mov es:[bx+di],ax
        add di,2
        jmp short s
ok1:    pop di
        pop si
        pop cx
        pop bx
         ret
code ends
end start
程序如上 ,但是执行程序后,屏幕上显示的为 12位,多出两位,前十位是4280012789,但是后两位却是两个符号。各位看官运行一下程序便知!
zaixuexi
[第1楼]   [ 回复时间:2011-04-18 22:42 ]   [引用]   [回复]   [ top ] 
荣誉值:93
信誉值:0
注册日期:2010-11-29 14:28
1. 就告诉你问题出在哪,自己改下

2. 问题点
s:      sub si,1    
        mov cl,[si] 
        mov ch,0 
        jcxz ok1 

3. DEBUG描述
C:\>debug cc.exe
-g 6f

AX=AC06  BX=0500  CX=00AC  DX=0803  SP=0006  BP=0000  SI=000A  DI=0006
DS=0C0A  ES=B800  SS=0C0B  CS=0C0C  IP=006F   NV UP EI PL NZ NA PE NC
0C0C:006F 4E            DEC     SI
-d ds:0
0C0A:0000  39 38 37 32 31 30 30 38-32 34 00 00 00 00 00 00   9872100824......

4. 分析
   从si为1开始[si从A~2略]
   sub  si,1             => si = 0
   mov  cl,[si]          => cl = ds:[0] = 39
   mov  ch,0             => ch = 0
   jcxz ok1              => 为0跳转到ok1,cx=39h不成立,继续走
   ..........略
   jmp  short s
s: sub si,1              => si = 0 - 1 = FFFF 
   mov cl,[si]           => cl = ds:[FFFF] = ?
   mov ch,0              => ch = 0
   jcxz ok1              => 未定义
   ..........略
   ..........直到cx遇见0为止
ok1:
   .......... 

5. 自己用DEBUG分析会更快
hhxylijiajia
[第2楼]   [ 回复时间:2011-04-20 09:51 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:2
注册日期:2011-02-01 10:19
明白了 多谢。
hhxylijiajia
[第3楼]   [ 回复时间:2011-04-20 09:52 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:2
注册日期:2011-02-01 10:19
此贴由 贴主 于 [ 2011-04-20 09:52 ] 结贴。 结贴原因:问题已解决
得分情况: 1楼(zaixuexi):4分  
此问题已结贴!
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved