Prolearning 发表于 2015-4-20 23:17:17

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

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:
       jcxz result
       mov al,ds:
   mov es:,al
       inc si
       add bp,2
       pop cx
       mov es:,cl
       add di,2
       jmp near ptr show_str
result:ret


code ends

end start

KTMONREK 发表于 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:
         jcxz result                                              ;当(cx)=0的时候,跳到result
         mov al,ds:               
   mov es:,al
         inc si
         add bp,2
         pop cx
         mov es:,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后面的指令

Prolearning 发表于 2015-4-21 18:47:32

KTMONREK 发表于 2015-4-21 08:52


{:5_109:}大神啊。十分感谢
页: [1]
查看完整版本: 有高手帮忙看一下我的程序为什么会进入死循环吗?