. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->直接定址表
主题 : :  实验16的CALL问题  [已解决] 回复[ 26次 ]   点击[ 1074次 ]  
borisyue
[帖 主] [ 发表时间:2008-11-21 00:02 ] 
荣誉值:0
信誉值:4
注册日期:2008-10-16 23:41
本人已写完实验16的代码,如下:
DATAS SEGMENT
   buff1 db "my teacher is ytt!"
   buff2 db "I am a student!" ;此处输入数据段代码  
DATAS ENDS

STACKS SEGMENT
   db 128 dup (0) ;此处输入堆栈段代码
STACKS ENDS

CODES SEGMENT
    ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
    mov ax,stacks
    mov ss,ax
    mov sp,128
    
    push cs
    pop ds
    MOV AX,0
    MOV es,AX
    mov si,offset int7c
    mov di,200h
    mov cx,offset int7cend-offset int7c
    cld 
    rep movsb
    cli
    mov word ptr es:[7cH*4],200h
    mov word ptr es:[7cH*4+2],0h
    sti
    mov bx,datas
    mov ds,bx
    mov bx,0b800H
    mov es,bx
    mov si,offset buff1
    mov di,0
    mov cx,12H
s1: mov bx,[si]
    mov es:[di],bx
    mov es:[di+1],70h
    add di,2
    add si,1
    loop s1
    mov si,offset buff2
    mov di,160
    mov cx,0FH
s2: mov bx,[si]
    mov es:[di],bx
    mov es:[di+1],70h
    add di,2
    add si,1
    loop s2
    call time
    mov ah,1
    mov al,2
    int 7cH
    call time
    ;此处输入代码段代码
    MOV AH,4CH
    INT 21H
    
time:push cx
     push bx
     mov cx,3000H
nottime:mov bx,3000H
nottime1: dec bx
          jnz nottime1
          loop nottime  
     pop bx
     pop cx
     ret  
    
    int7c:jmp short set
    table:dw sub1,sub2,sub3,sub4
      set:push bx
          cmp ah,3
          ja sret
          mov bl,ah
          mov bh,0
          add bx,bx
          call word ptr table[bx]
     sret:pop bx
          iret 
          
sub1:push bx
     push cx
     push es
     mov bx,0b800h
     mov es,bx
     mov bx,0
     mov cx,2000
sub1s:mov byte ptr es:[bx],' '
      add bx,2
      loop sub1s
      pop es
      pop cx
      pop bx
      ret

sub2: push bx
      push cx
      push es
      mov bx,0b800h
      mov es,bx
      mov bx,1
      mov cx,2000
sub2s:and byte ptr es:[bx],11111000b
      or es:[bx],al
      add bx,2
      loop sub2s
      pop es
      pop cx
      pop bx
      ret
      
sub3: push bx
      push cx
      push es
      mov cl,4
      shl al,cl
      mov bx,0b800h
      mov es,bx
      mov bx,1
      mov cx,2000
sub3s:and byte ptr es:[bx],10001111b
      or es:[bx],al
      add bx,2
      loop sub3s
      pop es
      pop cx
      pop bx
      ret
      
sub4:push cx
     push si
     push di
     push es
     push ds
     mov si,0b800h
     mov es,si
     mov ds,si
     mov si,160
     mov di,0
     cld 
     mov cx,24
sub4s:push cx
     mov cx,160
     rep movsb
     pop cx
     loop sub4s
     
     mov cx,80
     mov si,0
sub4s1:mov byte ptr [160*24+si],' '
       add si,2
       loop sub4s1
       pop ds
       pop es
       pop di
       pop si
       pop cx
       ret  
int7cend:nop
   
CODES ENDS
    END START
四个子程序没有什么问题,我试过单独CALL SUB1,CALL SUB2,CALL SUB3,CALL SUB4都没什么问题。
安装INT 7CH中断程序也没什么问题。经过调试,发现到call word ptr table[bx]这一步就出问题,不能正确地定位子程序的入口。各位高手看下,哪里错了?谢谢
borisyue
[第22楼] [ 回复时间:2008-12-10 20:55 ] 
荣誉值:0
信誉值:4
注册日期:2008-10-16 23:41
谢谢各位的答解。我明白错在哪里了。然后我去修改。把中断程序放在前面了。也做了些设置更改。很像21楼的代码。但还是弹出无效指令。郁闷~~~~~~~~
此问题已结贴!
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved