汇编网首页登录博客注册
gecko的学习博客
博客首页博客互动【做检测题】论坛求助

我的博客

个人首页 |  我的文章 |  我的相册 |  我的好友 |  最新访客 |  文章收藏 |  论坛提问 |  友情链接 |  给我留言  
图片载入中
  •  好男儿当志在天下,好男儿亦不负红颜!
  • 『姓名』:GECKO_LIN           
  • 『性别』:保密  『发送消息
  • 个人说明:好男儿当志在天下,好男儿亦不负红颜!
  • 详细信息『加为好友』
学习动态

[2007-11-29 18:42] 13.3 对int、ret和栈的深入理解

问题:用7CH中断例程完成loop指令的功能,在屏幕中间显示80个‘!’。

源代码及自己对代码的理解如下:(两个.asm文件,一个安装例程,一个测试)

安装例程:
assume cs:code
code segment
main:
mov ax,0
mov es,ax
mov di,200H
mov ax,cs
mov ds,ax
mov si,offset pro
mov cx,offset proend-offset pro
cld
rep movsb
mov ax,4c00H
int 21H

pro:
push bp
mov bp,sp
dec cx
jcxz over
add [bp+2],bx
over:
pop bp
iret
proend:
nop
code ends
end main

测试代码:
assume cs:code
code segment
start:
mov ax,0
mov es,ax
mov word ptr es:[7cH*4+2],0H
mov word ptr es:[7cH*4],0200H
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


源代码中的关键点:
mov bx,offset s-offset se       ;
int 7ch
add [bp+2],bx


S处的偏移地址为:145D:0021
Se处的偏移地址为:002A
-u
145D:0021 26            ES:
145D:0022 C60521        MOV     BYTE PTR [DI],21
145D:0025 83C702        ADD     DI,+02
145D:0028 CD7C          INT     7C
145D:002A 90            NOP
145D:002B B8004C        MOV     AX,4C00
145D:002E CD21          INT     21
145D:0030 F8            CLC
-

如何理解add [bp+2],bx?
我们都知道,执行iret时,相当于下面的操作:
Pop ip
Pop cs
Popf
而add[bp+2],bx时相当于对ip进行设置。因为后面的iret将用到他。
如果执行add[bp+2],bx。[bp+2]这个单元会是多少呢?
那先们看看bx等于多少?
在上面的程序中,执行完mov bx,offset s-offset se后。

Bx的值被设置成了FFF7。
AX=B800  BX=0000  CX=0030  DX=0000  SP=0000  BP=0000  SI=0000  DI=0780
DS=144D  ES=B800  SS=145D  CS=145D  IP=001B   NV UP EI PL NZ NA PO NC
145D:001B BBF7FF        MOV     BX,FFF7
-t

而在执行add [bp+2],bx之前[bp+2]等于多少呢?
查看内存:
AX=B800  BX=FFF7  CX=004F  DX=0000  SP=FFF8  BP=FFF8  SI=0000  DI=0782
DS=144D  ES=B800  SS=145D  CS=0000  IP=0206   NV UP DI PL NZ AC PO NC
0000:0206 015E02       ADD    [BP+02],BX                 SS:FFFA=002A
-d ss:fff8
145D:FFF0                          00 00 2A 00 5D 14 06 32           ..*.]..2
-
可以知道[bp+2]此时等于002AH

执行add [bp+2],bx后,[bp+2]=0021H,要注意的是,这恰好等于s处的偏移地址。
执行iret后。
Ip=0021H
Cs=145DH
Popf
程序还将继续执行,也就是循环的实现。

反之,如果不执行add [bp+2],bx,则[bp+2]=002AH,恰好是es标记处的偏移地址。执行iret会成为:
Ip=002AH
Cs=145DH
Popf
这样程序就结束了。
评论次数(1)  |  浏览次数(836)  |  类型(学习心得) |  收藏此文  | 

[  happy   发表于  2007-11-30 12:22  ]

博主学透了!养成了很好的学习习惯,向你学习!

 
 请输入验证码  (提示:点击验证码输入框,以获取验证码