问题:用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
这样程序就结束了。
![学习动态](images/model1/b8.gif)
![最新评论](images/model1/b1.gif)
- [游客] wo lai le 12/23 18:50
- [tangxin] 非常有道理 03/06 09:23
- [游客] 现在学校的教学已经不是那么回事了,还是得靠自学。 06/04 12:13
- [assemblyeaten] 顶一下 05/11 10:48
- [游客] eg 05/04 15:55
- [hacker_ld] 哈哈哈!!好文章! 04/30 22:35
- [游客] 其实,很多女孩子也不想那么学,只因考试的时候要考概念,,,,怪谁呢 03/15 17:43
- [游客] 呵呵,,,,好,,,2012 08/25 10:35
- [asshuke] 说的很好,我等菜鸟奋起直追呀! 08/14 11:24
- [xuyanghui] 很好啊,对我很有用的,很经典,谢谢坐着啦. 04/11 18:05
- [游客] 千术揭密教学www.pwmhg.cn 马洪刚反赌www.puke56.cn 马洪刚千术揭秘w 06/07 10:57
- [游客] [url=http://www.gddzbq.com]深圳搬家公司[/url] [url=http 03/02 15:07
- [gecko] 自己给自己留句话! 做人,最怕懒惰,在如何事情上都一样!我不该过于贪图方便.这样的选择,不止我对自 08/25 13:36
- [游客] 您好好我是个超级菜鸟。看了博主的几篇肺腑之言我,深受触动。于是我,有个想法。报软考。最初级。。 请 06/01 14:24
- [Wednesday] 嘿嘿 03/10 15:14
- [游客] 从键盘输入两个数字字符,存入缓冲区。 把sh1内的字符转换为十六进制,存入sh2.从sh2读 01/11 20:29
- [游客] 从键盘输入两个数字字符,存入缓冲区。 把sh1内的字符转换为十六进制,存入sh2.从sh2读入 01/09 21:15
- [gocker] 我重新审视了自己的ID和博主的ID``偶发现,我们长得太像了。。。假使,如果``我的ID后门没有加上 12/21 23:03
- [happy] 不知gecko的意思是想说什么?摸不着头脑??? 12/20 13:11
- [Wednesday] 可以直接发消息给我 注意右上角的消息中心 哈哈 11/08 18:00