. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->INT指令
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  实验13.1代码  [已解决] 回复[ 3次 ]   点击[ 488次 ]  
jjch224
[帖 主]   [ 发表时间: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
jjch224
[第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操作并且已满,我不知道王爽老师是不是要我们注意这个问题,还是其他方面的意识。这样的操作是否合理,请高手给予解答。
jjch224
[第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
jjch224
[第3楼]   [ 回复时间:2010-09-01 10:03 ]   [引用]   [回复]   [ top ] 
荣誉值:16
信誉值:0
注册日期:2010-07-09 09:48
此贴由 贴主 于 [ 2010-09-01 10:03 ] 结贴。 结贴原因:问题已解决
得分情况:
此问题已结贴!
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved