. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->外中断
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  实验15,按任意皱键也能全屏显示A!  [待解决] 回复[ 6次 ]   点击[ 595次 ]  
qing_liang
[帖 主]   [ 发表时间:2010-03-22 23:02 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-03-05 21:32
这道题其实和书中的15.5是一样的,我因为15.5把书上的代码抄了,运行不了,屏幕停不住,网上查了说要在dos实模式下才能运行,我也在虚拟机装的实dos下试了也不行,其实我知道已经运行了,只是速度太快了,我没有办法让它变慢,做实验15时看到有牛人用了 
       mov cx,10h
rkeyr:  ah,0
       int 16
       loop rkey
 才能显示颜色,并不是要在实模式下才能显示的.这几行用了16号中断.


下面的程序按任意键也能显示A,是因为把要栈弄错了.我是把网上抄的实验15,改成书上的15.5程序的时候把代码段,赋给了栈段,没想到这样尽可以错成按任意键显示A了.




assume cs:code  

data segment  
        dw 0,0  
data ends  
          
code segment  

start:  
        mov ax,data  
        mov ss,ax  
        mov sp,128 
         
        push cs 
        pop ds 
         
        mov ax,0 
        mov es,ax 
         
        mov si,offset int9 
        mov di,204h 
         
        mov cx,offset int9end - offset int9  
          
        cld   
        rep movsb  
          
        push es:[9*4]  
        pop es:[200h]  
        push es:[9*4+2]  
        pop es:[202h]  
          
        cli  
        mov word ptr es:[9*4],204h  
        mov word ptr es:[9*4+2],0  
        sti  
          
        mov cx,00h  
rkey:  
        mov ah,0  
        int 16h  
        loop rkey  

        push es:[200h]  
        pop es:[9*4]  
        push es:[202h]  
        pop es:[9*4+2]  
          
        mov ax,4c00h  
        int 21h  

                          
int9:  
        push ax  
        push es  
        push di  
        push cx  

        in al,60h  
                  
        pushf  
        call dword ptr cs:[200h]  
          
        cmp al,9eh 
        jne int9ret  
          
        mov ax,0b800h  
        mov es,ax  
        mov di,0  
          
        mov cx,2000  
showa:  
        mov byte ptr es:[di],'A'  
        add di,2  
        loop showa  

int9ret:  
        pop cx  
        pop di  
        pop es  
        pop ax  
        iret  

int9end:  
        nop          
          
code ends  

end start
qing_liang
[第1楼]   [ 回复时间:2010-03-22 23:10 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-03-05 21:32
assume cs:code 

stack segment 
   db 128 dup (0) 
stack ends 

code segment 
                start:          mov ax,stack 
                                mov ss,ax 
                                mov sp,128 

                                push cs 
                                pop ds 

                                mov ax,0 
                                mov es,ax 

                                mov si,offset int9 
                                mov di,204h 
                                mov cx,offset int9end-offset int9 
                                cld 
                                rep movsb
                                
                                push es:[9*4] 
                                pop es:[200h] 
                                push es:[9*4+2] 
                                pop es:[202h] 

                                
                                cli 
                                mov word ptr es:[9*4],204h 
                                mov word ptr es:[9*4+2],0 
                                sti
                                 
                                mov cx,00h
                                                rkey: 
                                                        mov ah,0 
                                                        int 16h 
                                                        loop rkey 

                                

                                mov ax,4c00h 
                                int 21h 
                             
        
                                
                                

                  int9:         push ax 
                                push bx 
                                push cx 
                                push es 

                                in al,60h 

                                pushf 
                                call dword ptr cs:[200h] 

                                cmp al,3bh 
                                jne int9ret 

                                mov ax,0b800h 
                                mov es,ax 
                                mov bx,1
                                
                                mov cx,2000
                       s:       inc byte ptr es:[bx]
                                add bx,2 
                                loop s 

                   int9ret:     pop es 
                                pop cx 
                                pop bx 
                                pop ax 
                                iret 

                     int9end:   nop 

code ends 
end start



这是15.5把cmp al,3bh:换成cmp al,9eh,  把s:标号后换成mov byte ptr es:[bx],'A',  把mov bx,1换成mov bx,0 就是实验15了.
zihaolee
[第2楼]   [ 回复时间:2010-05-06 16:09 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2009-03-04 10:05
菜鸟路过,第一条程序的确运行结果是任意键都顺利输出A,不知道为什么,等待高人解答~
masmaster
[第3楼]   [ 回复时间:2010-06-28 12:07 ]   [引用]   [回复]   [ top ] 
荣誉值:268
信誉值:12
注册日期:2010-06-18 22:19
mov cx,00h 
                                                rkey:  
                                                        mov ah,0  
                                                        int 16h  
                                                        loop rkey 
;这是一个死循环吧!
character_w
[第4楼]   [ 回复时间:2011-03-03 16:53 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:4
注册日期:2011-01-29 19:28
int 16h 有什么用?但是貌似删了int 16h就不行了!~~

菜鸟表示不懂~谢谢。
youguiqing
[第5楼]   [ 回复时间:2011-03-18 22:47 ]   [引用]   [回复]   [ top ] 
荣誉值:6
信誉值:0
注册日期:2009-12-03 21:13
assume cs:code

stack segment
       dw 8 dup (0)
stack ends

code segment
      start: mov ax,0b800h
            mov ds,ax
            mov si,160*8+12
            mov ax,stack
            mov ss,ax
            mov sp,16
            mov dh,2
            mov dl,'a'
       suru:in al,60h   ;按住ESC变绿放开变红色
           cmp al,1h
            jne  jx
            mov dh,2
         jx:cmp al,81h
            jne jx1
            mov dh,4
         jx1:mov [si],dx
           call yansi
           inc dl
           add si,2
           cmp dl,'z'
         jna suru
         mov ax,4c00h
         int 21h           
    yansi:  push dx          ;子程序停1秒
         push ax
         mov dx,1fffh
         mov ax,0
       s:sub ax,1
         sbb dx,0
         cmp ax,0
         jne s
         cmp dx,0
         jne s
         pop ax
         pop dx
         ret
 
code ends
end start
oldstone
[第6楼]   [ 回复时间:2011-03-28 23:05 ]   [引用]   [回复]   [ top ] 
荣誉值:6
信誉值:0
注册日期:2011-02-04 09:04
rkey:   
        mov ah,0   
        int 16h   
        loop rkey   

        push es:[200h]   
        pop es:[9*4]   
        push es:[202h]   
        pop es:[9*4+2] 
循环下面的几条语句,又把原中断的指向还回去了,这样es[9*4]的双字内容不再是CS=0000,IP=0200H了,问题是不是出在这里呢?
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved