. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->CALL和RET指令
主题 : :  第十章实验第三个子程序搞不掂,帮帮我。  [待解决] 回复[ 10次 ]   点击[ 524次 ]  
cairulong
[帖 主] [ 发表时间:2008-06-07 18:26 ] 
荣誉值:0
信誉值:0
注册日期:2008-04-27 16:45
assume cs:code,ds:data,ss:stack
data segment
db 10 dup(0)
data ends        
stack segment
db 16 dup(0)
stack ends
code segment
start:  mov ax,data
        mov ds,ax
        mov ax,12666
        mov si,0
        call dtoc
        mov ax,4c00h
        int 21h
;-------------------------------------------------------------------
;名称:dtoc 
;功能:将WORD型数据变为表示十进制数的字符串,字符串以0为结尾符。
;参数:(ax)=word型数据,ds:si指向字符串的首地址
;返回:无
dtoc:   
        mov cx,0
        push cx
      s0:mov cx,0Ah
        call divdw
        add cl,30h
        push cx ;将余数压入栈,做交换准备
        mov cx,ax 
        jcxz exit0 ;判断商是否为零
         jmp short s0        
  exit0:pop cx
        jcxz s2 
        mov ds:[si],cl
        inc si
        jmp short exit0        
     s2:mov dh,1
        mov dl,1
        mov cl,12
        mov si,0
        call show_str
        ret
;-----------------------------------------------------------------------
;名称:divdw  
;公式:x/n=int(H/n)*65535+[rem(H/n)+L]/n 
;功能:进行不会产生溢出的除法,被除数为DWORD型,除数为WORD型,结果为DWORD 
;参数:(ax)=dword型的数据的低16位(DX)=DWORD型数据的高16位,(CX)除数 
;返回:(DX)=结果的高16位,(AX)=结果的低16位,(CX)=余数         
divdw:
        push ax
        mov ax,dx
        mov dx,0
        div cx
        mov bx,ax
        pop ax
        div cx
        mov cx,dx
        mov dx,bx                
        ret
;-------------------------------------------------------------------------------
;显示字符串子程序 
;名称:show_str 
;功能:在指定的位置,用指定的颜色,显示一个用0结束的字符串 
;参数:(DH)=行号(取值范围1-25),(DL)=列号(取值范围1-80)(CL)=颜色 
;    DS:SI指向字符串的首地址 
show_str:
         mov ax,0b800h
         mov es,ax
         mov al,0A0h
         dec dh
         mul dh
         mov bx,ax
         mov al,2 
         dec dl
         mul dl
         mov di,ax
         mov al,cl
       s:mov ah,ds:[si]                                        
         mov ch,ah  ;判断是否是0字符
         mov cl,0
         jcxz return
         mov  es:[bx+di],ah
         mov  es:[bx+di+1],al
         add di,2
        inc si
        jmp short s
 return:
        ret
code ends
end start


在win-masm中编译运行,在显示出603795834
在debug中用G命令执行后是12666
正确结果应该是12666,可就是不知道为什么?
各位帮我看看,谢谢!
lower
[第6楼] [ 回复时间:2008-06-10 17:51 ] 
荣誉值:0
信誉值:0
注册日期:2008-06-10 17:45
在dtoc函数里面的这一行:exit0:pop cx 循环终止之后,仍然会有数据(或许是0)出栈,进入cx中,这样sp的指向就发生了变化,ret也就不能正确返回了。
修改之后,在s2:后面加上push cx,结果仍然有错误,但是和12666比较接近了,估计后面还有与栈相关的数据问题。
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved