鱼C论坛

 找回密码
 立即注册
查看: 2344|回复: 2

有高手帮忙看一下我的程序为什么会进入死循环吗?

[复制链接]
发表于 2015-4-20 23:17:17 | 显示全部楼层 |阅读模式
20鱼币
assume cs:code,ss:stack,ds:data
data segment
   db 'Welcome to masm!',0
data ends

stack segment
   db 16 dup(0)
stack ends

code segment
start:mov dh,8
      mov dl,3
      mov cl,2
          mov ch,0  
      mov ax,data
      mov ds,ax
      mov si,0
      mov ax,stack
      mov ss,ax
      mov sp,16
          mov ax,0b800h  
          mov es,ax         
          push cx
          mov bh,0
          mov bl,dh
          sub bx,1
          mov ch,0
          mov cl,dl
          sub cx,1
          mov ah,0
          mov al,0a0h
          mul bl
          mov bp,ax
          mov ah,0
          mov al,2
          mul cl
          add bp,ax
          mov di,bp
          inc di
          pop cx
      call show_str
      mov ax,4c00h
      int 21h
show_str:push cx
         mov ch,0
         mov cl,byte ptr ds:[si]
         jcxz result
         mov al,ds:[si]
     mov es:[bp],al
         inc si
         add bp,2
         pop cx
         mov es:[di],cl
         add di,2
         jmp near ptr show_str
result:ret


code ends

end start

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-4-20 23:17:18 | 显示全部楼层
本帖最后由 KTMONREK 于 2015-4-21 08:58 编辑
assume cs:code,ss:stack,ds:data
data segment
   db 'Welcome to masm!',0                            ;这是你的代码,下面我注释的地方为错误的地方
data ends

stack segment
   db 16 dup(0)
stack ends

code segment
start:mov dh,8
      mov dl,3
      mov cl,2
          mov ch,0  
      mov ax,data
      mov ds,ax
      mov si,0
      mov ax,stack
      mov ss,ax
      mov sp,16
          mov ax,0b800h  
          mov es,ax         
          push cx
          mov bh,0
          mov bl,dh 
          sub bx,1
          mov ch,0
          mov cl,dl
          sub cx,1
          mov ah,0
          mov al,0a0h
          mul bl
          mov bp,ax
          mov ah,0
          mov al,2
          mul cl
          add bp,ax
          mov di,bp
          inc di
          pop cx
      call show_str
      mov ax,4c00h
      int 21h
show_str:push cx                               ;!!!注意!!!
         mov ch,0
         mov cl,byte ptr ds:[si]
         jcxz result                                              ;当(cx)=0的时候,跳到result
         mov al,ds:[si]                 
     mov es:[bp],al
         inc si
         add bp,2
         pop cx
         mov es:[di],cl
         add di,2
         jmp near ptr show_str
result:ret                       ;注意这里,你直接就ret的话,程序会跳到cs:0002的地址处执行
                    ;因为此时栈顶指针指向的是你push cx的值,即0002h,并不是call语句的下一条指令地址
                              ;更改如下:
code ends                ;result:    pop cx
                                  ; ret    
end start                    ;这样才会跳回call后面的指令
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2015-4-21 18:47:32 | 显示全部楼层

大神啊。十分感谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-18 20:30

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表