| 
 | 
 
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册  
 
x
 
(2)编写并安装int 7ch 中断例程,功能为完成loop指令的功能。 
        参数:(cx)= 循环次数, (bx)= 移位。 
        以上中断例程安装成功后,对下面的程序进行单步跟踪,尤其注意观察int、iret 指令执行前后CS、IP和栈中的转态。 
        在屏幕中间显示80个‘ !’ 
- assume cs:code
 
  
- code segment
 
 - start:
 
 -                 mov ax, 0b800h
 
 -                 mov es, ax
 
 -                 mov di, 160*12
 
 -                 mov bx, offset s - offset se
 
 -                 mov cx, 80
 
 - s:
 
 -                 mov byte ptr es:[di], '!'
 
 -                 add di, 2
 
 -                 int 7ch
 
 - se:
 
 -                 nop
 
 -                 mov ax, 4c00h
 
 -                 int 21h
 
 - code ends
 
 - end start
 
  复制代码 
 
 
这道题我一共编写了两个程序但是有一个程序只有执行debug 能执行出来,单独执行exe总是崩溃我感觉这道题我逻辑没有错误为什么就是执行不了呢? 
- assume cs:code
 
  
- code segment
 
 - start:
 
 -                 mov ax, cs
 
 -                 mov ds, ax
 
 -                 mov si, offset text_1
 
 -                 
 
 -                 mov ax, 0
 
 -                 mov es, ax
 
 -                 mov di, 200h
 
 -                 
 
 -                 mov cx, offset text_4 - offset text_1
 
 -                 
 
 -                 cld
 
 -                 rep movsb
 
 -                 
 
 -                 mov ax, 0
 
 -                 mov es, ax
 
 -                 mov word ptr es:[7ch * 4], 200h
 
 -                 mov word ptr es:[7ch * 4 + 2], 0
 
 -                 
 
 -                 mov ax, 4C00h
 
 -                 int 21h
 
  
- text_1:
 
 -                 push bp
 
 -                 dec cx
 
 -                 jcxz text_3
 
 -                 
 
 -                 mov bp, sp 
 
 -                 add word ptr ss:[bp + 2], bx
 
 -                 pop bp
 
 -                 iret
 
 - text_3:
 
 -                 iret
 
 - text_4:
 
 -                 nop
 
 - code ends
 
 - end start
 
  复制代码 
- text_1:
 
 -         push        bp
 
 -         dec        cx
 
 -         jcxz        text_3
 
 -         
 
 -         mov        bp, sp
 
 -         add        word ptr ss:[bp + 2], bx
 
 -         pop        bp
 
 -         iret
 
 - text_3:
 
 -         iret
 
 - text_4:
 
 -         nop
 
  复制代码 
试想一下这样一种情况 
一进来先执行了一个push bp,然后又执行了一个dec cx,然后执行jcxz text_3,条件成立,跳转到text_3执行iret 
有没有发现,之前push到堆栈的bp没有pop出来,堆栈不平衡了
 - assume cs:code
 
  
- code segment
 
 - start:
 
 -         mov        ax, cs
 
 -         mov        ds, ax
 
 -         mov        si, offset text_1
 
 -         
 
 -         mov        ax, 0
 
 -         mov        es, ax
 
 -         mov        di, 200h
 
 -         mov        cx, offset text_4 - offset text_1
 
 -         cld
 
 -         rep        movsb
 
 -         
 
 -         cli
 
 -         mov        word ptr es:[7ch * 4], 200h
 
 -         mov        word ptr es:[7ch * 4 + 2], 0
 
 -         sti
 
 -         
 
 -         mov        ax, 4C00h
 
 -         int        21h
 
 -         
 
 - text_1:
 
 -         push        bp
 
 -         mov        bp, sp
 
 -         dec        cx
 
 -         jcxz        text_3
 
 -         add        word ptr ss:[bp + 2], bx
 
 - text_3:
 
 -         mov        sp, bp
 
 -         pop        bp
 
 -         iret
 
 - text_4:
 
 -         nop
 
 - code ends
 
 - end start
 
  复制代码 
- assume cs:code
 
  
- code segment
 
 - start:
 
 -         mov        ax, 0b800h
 
 -         mov        es, ax
 
 -         mov        di, 160 * 12
 
 -         mov        bx, offset s - offset se
 
 -         mov        cx, 80
 
 - s:
 
 -         mov        byte ptr es:[di], '!'
 
 -         add        di, 2
 
 -         int        7ch
 
 - se:
 
 -         mov        ax, 4c00h
 
 -         int        21h
 
 - code ends
 
 - end start
 
  复制代码 
 
 
 |   
 
 
 
 |