|
主题 : : 实验13.1代码 [已解决] |
回复[ 3次 ]
点击[ 488次 ] | |
|
|
|
|
[帖 主]
[ 发表时间:2010-08-17 11:33 ]
[引用]
[回复]
[ top ] | |
荣誉值:16
信誉值:0
注册日期:2010-07-09 09:48 |
;p262 exam13.1编写并安装int 7ch中断例程,功能为显示一个用0结束的字符串,安装在0:200处。
assume cs:code
data segment
db "Welcome to masm,jjch!",0
data ends
code segment
start:
mov ax,cs
mov ds,ax
mov si,offset displayc
mov ax,0
mov es,ax
mov di,200h
mov cx,offset displaycend-offset displayc
cld ;df清零,正向
rep movsb ;复制代码到0:200处
mov ax,0
mov ds,ax
mov word ptr ds:[7ch*4],200h
mov word ptr ds:[7ch*4+2],0;设置中断向量
mov dh,24
mov dl,0
mov cl,2
mov ax,data
mov ds,ax
mov si,0
int 7ch
mov ax,4c00h
int 21h
displayc:
push di
push bx
push dx
mov ax,0b800h
mov es,ax
mov di,0
add dl,dl ;dl*2
mov al,160
mul dh ;160*dh
mov dh,0
add ax,dx
mov bx,ax ;bx=160*dh+2*dl
s: cmp byte ptr ds:[si],0
je ok ;zf=0跳转
mov al,ds:[si]
mov ah,cl
mov word ptr es:[bx+di],ax
inc si
add di,2
jmp short s
ok: pop dx
pop bx
pop di
iret
displaycend: nop
code ends
end start | | |
|
|
|
|
[第1楼]
[ 回复时间:2010-08-17 12:11 ]
[引用]
[回复]
[ top ] | |
荣誉值:16
信誉值:0
注册日期:2010-07-09 09:48 |
-r(初始值)
AX=0000 BX=0000 CX=0089 DX=0000 SP=0000 BP=0000 SI=0000 DI=0000
DS=20B4 ES=20B4 SS=20C4 CS=20C6 IP=0000 NV UP EI PL NZ NA PO NC
(执行int 7ch后的sp的值以及栈状态)
20C6:0034 CD7C INT 7C
-t
AX=20C4 BX=0000 CX=0002 DX=1800 SP=FFFA BP=0000 SI=0000 DI=022D
DS=20C4 ES=0000 SS=20C4 CS=0000 IP=0200 NV UP DI PL NZ NA PO NC
-d 20c4:fffa
20C4:FFF0 36 00 C6 20 02 32 6.. .2
(ip)=0036h指向mov ax,4c00h
(cs)=20c6h
(flag)=3202h
入栈的次序依次是:flag、cs、ip这跟12章提及的中断处理过程是一致的。
很明显发生了环绕并覆盖了以前的数据。就相当于在执行int 7ch指令以前,20c4栈段做了push操作并且已满,我不知道王爽老师是不是要我们注意这个问题,还是其他方面的意识。这样的操作是否合理,请高手给予解答。 | | |
|
|
|
|
[第2楼]
[ 回复时间:2010-08-18 09:16 ]
[引用]
[回复]
[ top ] | |
荣誉值:16
信誉值:0
注册日期:2010-07-09 09:48 |
exam13.2
assume cs:code
code segment
start:
mov ax,cs
mov ds,ax
mov si,offset c_loop
mov ax,0
mov es,ax
mov di,200h
mov cx,offset c_loopend-offset c_loop
cld
rep movsb
;设置中断向量
mov ax,0
mov es,ax
mov word ptr es:[7ch*4],200h;偏移地址
mov word ptr es:[7ch*4+2],0;段地址-都是字单元
;display 80 '!'
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
c_loop:
push bp
mov bp,sp
dec cx
jcxz ok;if cx=0 jmp ok else add bx
add ss:[bp+2],bx;注意bx为负。
ok:
pop bp
iret
c_loopend: nop
code ends
end start | | |
|
|
|
|
[第3楼]
[ 回复时间:2010-09-01 10:03 ]
[引用]
[回复]
[ top ] | |
荣誉值:16
信誉值:0
注册日期:2010-07-09 09:48 |
此贴由 贴主 于 [ 2010-09-01 10:03 ] 结贴。 结贴原因:问题已解决 | | |
|