. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->CALL和RET指令
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  三个子程序不难,但做设计一时在dos的debug时显示位置正确,但在dos直接执行显示位置不对  [待解决] 回复[ 3次 ]   点击[ 412次 ]  
lmyycx
[帖 主]   [ 发表时间:2009-01-10 10:39 ]   [引用]   [回复]   [ top ] 
荣誉值:2
信誉值:0
注册日期:2008-05-08 23:42
我已经搞的头昏脑胀的程序如下
只是一个要在第八行第三列连续三行显示345980这个数字,在dos里用debug加载直接用g键运行显示正确
但在dos里直接执行时,显示的位置不对,你说调试时是好的,怎么执行时又变了,哪位高手指教一下?




assume cs:code

table segment
 dd 345980
table ends
data segment
db 10 dup(0)
data ends
stack segment
    dw 8 dup(0)
stack ends
code segment
start: mov ax,table
         mov ds,ax 
         mov ax,stack
         mov ss,ax
         mov sp,16
         mov dh,8    ;第八行
         mov dl,3    ;第三列
         mov ah,0
         mov al,2
         mul dl
         mov bx,ax
         mov al,80*2
         mul dh
         add bp,ax   ;bp里就是第八行第三列的字节数     

       
         mov cx,3
    s3:mov ax,ds:[0]        ;设置ax ,dx参数
         mov dx,ds:[2]
         push cx
         push ds
         mov si,0
         call dwdtoc        ;调用转换双字数字为字符串子程序

                             
        
         call show_str        ;调用显示字符串
         pop ds
         pop cx
         loop s3 
       
         mov ax,4c00h
         int  21h
        

    dwdtoc:mov di,0       ;双字数字转字符串
       s: mov cx,10
         call divdw       ;调用不溢出除法子程序
         inc di
         add cx,30h
         push cx
         push ax
         add ax,dx
         mov cx,ax
         pop ax
         jcxz ok
         jmp short s
    ok:mov cx,di
       
        mov ax,data 
        mov ds,ax
    s1: pop [si]
          inc si
         loop s1
        mov ax,data
        mov ds,ax
         ret
divdw:push ax
          push dx
          pop ax
          mov dx,0
          div cx
          pop bx
          push ax
          mov ax,bx
          div cx
          mov cx,dx
          pop dx
          ret


show_str: mov ax,0b800h     ;显示字符串
                 mov es,ax
            
                 mov ax,data
                 mov ds,ax
                 mov ch,0
                 
                 mov si,0
                 mov cx,di
           s2: mov al,[si]
                 mov es:[bp],al
                 inc si
                 add bp,2
                 loop s2
                mov ah,0
                mov al,2
                mul di
                sub bp,ax
                add bp,160      ;bp指向下一行同列位置
                 ret
                
         
code ends
end start
wsrf
[第1楼]   [ 回复时间:2009-01-13 21:02 ]   [引用]   [回复]   [ top ] 
荣誉值:33
信誉值:0
注册日期:2008-10-16 10:01
yangle0125
[第2楼]   [ 回复时间:2009-02-03 21:24 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2008-11-09 12:50
show_str 不用bp做参数吧?
就算用bp做参数,楼主的程序这里:
start: mov ax,table 
         mov ds,ax  
         mov ax,stack 
         mov ss,ax 
         mov sp,16 
         mov dh,8    ;第八行 
         mov dl,3    ;第三列 
         mov ah,0 
         mov al,2 
         mul dl 
         mov bx,ax 

最后这个bx,我想应该是bp吧
yangle0125
[第3楼]   [ 回复时间:2009-02-03 21:28 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2008-11-09 12:50
至于头昏脑涨,我想楼主应该明确每个子程序的功能,参数以及结果储存使用的寄存器,外部程序整个其实就是准备参数的一个过程
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved