. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->CALL和RET指令
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  实验10-1显示字符串,程序成功但不能单步执行,为什么?  [已解决] 回复[ 2次 ]   点击[ 478次 ]  
ztf770710
[帖 主]   [ 发表时间:2010-02-07 21:14 ]   [引用]   [回复]   [ top ] 
荣誉值:4
信誉值:2
注册日期:2008-01-16 11:01
assume cs:code

data segment
  db 'Welcome to masm!',0
data ends

stack segment
  dw 8 dup (0)
stack ends

code segment
start: mov ax,stack
       mov ss,ax
       mov sp,16           ;设置栈段
       mov dh,8            ;输入行号
       mov dl,3            ;输入列号            
       mov cl,2            ;输入颜色
       mov ax,data
       mov ds,ax          
       mov si,0            ;设置字符串首地址
       call show_str       ;调用子程序show_str

       mov ax,4c00h
       int 21h

show_str: push es
          push ds
          push si
          push ax
          push bx
          push dx
          push cx          ;将子程序用到的寄存器入栈      

          mov al,10        
          mul dh
          mov bx,0b800h    
          add ax,bx        
          mov es,ax        ;设置行段地址
          mov bh,0
          mov bl,dl
          add bx,bx
          sub bx,2         ;设置第一个字符的偏移地址(列地址)
       s: mov cl,[si]
          mov ch,0
          jcxz ok          ;如果(cx)=0,结束;如果不是0,处理
          pop cx           ;将子程序中要用的寄存器内的内容出栈
          push cx          ;将子程序要用到的寄存器入栈          
          mov dl,[si]      
          mov es:[bx],dl   ;将字符的ASCII码写入显存
          mov es:[bx+1],cl ;将字符的属性写入显存
          inc si
          add bx,2         ;下一个字符
          jmp near ptr s   ;跳转到s处执行

      ok: pop cx
          pop dx
          pop bx
          pop ax
          pop si           
          pop ds
          pop es           ;将子程序用到的寄存器出栈
          ret
          
code ends
end start

此程序能顺利实现功能,但debug中用t单步执行时,运行到push dx时会引起冲突关闭程序,需用g命令直接运行到mov ax,4c00h,才能顺利显示字符,为什么呢?
bigbigwolf
[第1楼]   [ 回复时间:2010-02-08 19:36 ]   [引用]   [回复]   [ top ] 
荣誉值:2
信誉值:0
注册日期:2010-01-13 10:56
把栈设置大些,在第一版第四章的时候有遇到这个问题,涉及到后面的中断和系统保护机制了。
ztf770710
[第2楼]   [ 回复时间:2010-02-16 17:23 ]   [引用]   [回复]   [ top ] 
荣誉值:4
信誉值:2
注册日期:2008-01-16 11:01
此贴由 贴主 于 [ 2010-02-16 17:23 ] 结贴。 结贴原因:问题已解决
得分情况:
此问题已结贴!
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved