鱼C论坛

 找回密码
 立即注册
查看: 2578|回复: 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

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

  5. stack segment
  6.    db 16 dup(0)
  7. stack ends

  8. code segment
  9. start:mov dh,8
  10.       mov dl,3
  11.       mov cl,2
  12.           mov ch,0  
  13.       mov ax,data
  14.       mov ds,ax
  15.       mov si,0
  16.       mov ax,stack
  17.       mov ss,ax
  18.       mov sp,16
  19.           mov ax,0b800h  
  20.           mov es,ax         
  21.           push cx
  22.           mov bh,0
  23.           mov bl,dh
  24.           sub bx,1
  25.           mov ch,0
  26.           mov cl,dl
  27.           sub cx,1
  28.           mov ah,0
  29.           mov al,0a0h
  30.           mul bl
  31.           mov bp,ax
  32.           mov ah,0
  33.           mov al,2
  34.           mul cl
  35.           add bp,ax
  36.           mov di,bp
  37.           inc di
  38.           pop cx
  39.       call show_str
  40.       mov ax,4c00h
  41.       int 21h
  42. show_str:push cx                               ;!!!注意!!!
  43.          mov ch,0
  44.          mov cl,byte ptr ds:[si]
  45.          jcxz result                                              ;当(cx)=0的时候,跳到result
  46.          mov al,ds:[si]                 
  47.      mov es:[bp],al
  48.          inc si
  49.          add bp,2
  50.          pop cx
  51.          mov es:[di],cl
  52.          add di,2
  53.          jmp near ptr show_str
  54. result:ret                       ;注意这里,你直接就ret的话,程序会跳到cs:0002的地址处执行
  55.                     ;因为此时栈顶指针指向的是你push cx的值,即0002h,并不是call语句的下一条指令地址
  56.                               ;更改如下:
  57. code ends                ;result:    pop cx
  58.                                   ; ret   
  59. end start                    ;这样才会跳回call后面的指令
复制代码

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

大神啊。十分感谢
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-2 10:20

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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