. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->CALL和RET指令
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  实验10.3的疑问  [待解决] 回复[ 2次 ]   点击[ 266次 ]  
zhouokyes
[帖 主]   [ 发表时间:2008-10-29 09:06 ]   [引用]   [回复]   [ top ] 
荣誉值:12
信誉值:0
注册日期:2008-04-05 17:12
我的算法如下:存在的主要问题是子程序dtoc在最后循环中将1送入cx后,接着执行loop s0,但cx自己变为0,程序没有跳转,却返回了,不明白.对于输出顺序颠倒问题自己能解决.
assume cs:code
data segment
        db 10 dup (0)
data ends

code segment
start:        
        mov ax,12666
        mov bx,data
        mov ds,bx                ;定义数据段
        mov si,0
                
        call dtoc                ;16进制转10进制,ax为参数

        mov dh,8                ;8行
        mov dl,3                ;3列
        mov cl,2                ;颜色

        call show_str                ;显示dx中的内容

        mov ax,4c00h
        int 21h
        

dtoc:        
        
        mov bx,10
s0:        mov dx,0
        div bx
        add dx,30h                ;余数加30
        mov ds:[si],dl                ;余数送内存
        mov cx,ax                ;商送cx
        
        inc si                        ;si加1

        jcxz s1
        loop s0
s1:        ret


show_str:
        assume ss:stack
        stack segment stack
                dw 10 dup(0) 
        stack ends
        mov ax,stack
        mov ss,ax
        mov ax,0b800h                ;显存起始地址b800h
        mov es,ax                ;送es
        mov bl,cl                ;字符的颜色参数送bl,腾空cx留待后用
        push bx
        push dx


        mov ah,0
        mov al,dh                ;行数送al中
        mov bx,160
        mul bx                        
         
        pop dx                        ;压入堆栈,因为后面的mul bx会清除dx中的内容
        push ax
        mov ax,0                ;ax清0
        mov al,dl                ;列值送al
        mov bx, 2                        
        mul bx                        ;ax乘以2为行中的准确位置,此指令修改dx        

        mov bx,ax
        pop ax
        adc ax,bx        

        pop bx
        mov di,ax

        mov si,0
        
        mov ch,0                ;寄存器清零
s2:        mov cl,ds:[si]                ;字符串首个字符送cl
        mov es:[di],cl                ;cl中字符送显存
        inc di                        ;di加1
        mov es:[di],bl                ;颜色参数送显存
        inc si                        ;si加1
        inc di                        ;di加1
        jcxz s3                        ;判断cx是否为零,不为0则取下一个字符,是0则结束循环

        loop        s2
s3:        ret

code ends
end start
zhouokyes
[第1楼]   [ 回复时间:2008-10-30 20:53 ]   [引用]   [回复]   [ top ] 
荣誉值:12
信誉值:0
注册日期:2008-04-05 17:12
已解决,执行loop指令时先执行cx=cx-1
younggay
[第2楼]   [ 回复时间:2008-11-06 16:12 ]   [引用]   [回复]   [ top ] 
荣誉值:273
信誉值:0
注册日期:2008-01-23 20:23
是的,我也犯过这样错误。loop的执行过程是:
(1)cx=cx-1
(2)如果cx=0,停止循环;否则,继续下一循环。
一定要注意的是,cx的自减发生在循环体第一次执行完毕后,如果一开始就cx=0的话,第一遍执行后cx就是FFFFH了,所以loop还会继续循环,直至cx=0再次出现。
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved