. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->直接定址表
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  最新捷报`~`  [待解决] 回复[ 19次 ]   点击[ 1012次 ]  
101319007
[帖 主]   [ 发表时间:2008-02-25 18:02 ]   [引用]   [回复]   [ top ] 
荣誉值:3
信誉值:0
注册日期:2007-08-07 13:15
今天是第10天,突破16章.附上实验16代码.
assume cs:code
code segment
int7c:jmp short int7c_set
table dw sub1,sub2,sub3,sub4
int7c_set:push bx
          cmp ah,3
          ja int7c_exit
          mov bh,0
          mov bl,ah
          add bx,bx
          call word ptr table[bx]
int7c_exit:pop bx
           iret
sub1:push bx
     push cx
     push es
     mov bx,0b800h
     mov es,bx
     mov cx,2000
     mov bx,0
sub1s:mov byte ptr es:[bx],' '
     add bx,2
     loop sub1s
     pop es
     pop cx
     pop bx
     ret
     
sub2:push ax
     push bx
     push cx
     push es
     mov bx,0b800h
     mov es,bx
     mov bx,1
     mov cx,2000
sub2s:and byte ptr es:[bx],11110000b
     or es:[bx],al
     add bx,2
     loop sub2s
     pop es
     pop cx
     pop bx
     pop ax
     ret

sub3:push ax
     push bx
     push cx
     push es
     mov bx,0b800h
     mov es,bx
     mov cl,4
     shl al,cl
     mov cx,2000
     mov bx,1
sub3s:and byte ptr es:[bx],00001111b
     or es:[bx],al
     add bx,2
     loop sub3s
     pop es
     pop cx
     pop bx
     pop ax
     ret
      
sub4:push cx
     push si
     push di
     push ds
     push es
     mov si,0b800h
     mov es,si
     mov ds,si
     mov si,160
     mov di,0
     mov cx,24
     cld
sub4s:push cx
     mov cx,160
     rep movsb
     pop cx
     loop sub4s
     mov cx,80
     mov si,0
sub4s2:mov byte ptr es:[si],' '
     add si,2
     loop sub4s2
     pop es
     pop ds
     pop di
     pop si
     pop cx
     ret

int7c_end:nop

start:mov ax,0
      mov es,ax
      mov di,200h
      mov ax,cs
      mov ds,ax
      mov si,offset int7c
      mov cx,offset int7c_end-offset int7c
      cld
      rep movsb  
      cli
      mov word ptr es:[7ch*4],0
      mov word ptr es:[7ch*4+2],20h
      sti
      mov ax,4c00h
      int 21h


code ends
end start
wdm
[第1楼]   [ 回复时间:2008-02-25 21:22 ]   [引用]   [回复]   [ top ] 
荣誉值:342
信誉值:0
注册日期:2007-12-06 10:21
无语.....
crazyman
[第2楼]   [ 回复时间:2008-02-25 21:25 ]   [引用]   [回复]   [ top ] 
荣誉值:152
信誉值:3
注册日期:2008-01-24 21:26
to  101319007:
你就是江湖我大哥!学习劲头都跟你似的,中国计算机的发展估计就要坐火箭了!
huadong
[第3楼]   [ 回复时间:2008-02-26 14:06 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2007-12-15 17:23
恭喜,看来你基础应该不错.
我是去年12.20开始学习,搞到现在才弄完16章,目前本章还有一点没有搞明白的地方.
我属于很慢的那种.悟性低,没有办法.
xiaochong
[第4楼]   [ 回复时间:2008-02-27 15:32 ]   [引用]   [回复]   [ top ] 
荣誉值:45
信誉值:0
注册日期:2007-05-05 09:01
回复:[第3楼]
------------------
学习贵在坚持,不放弃!
tsql863
[第5楼]   [ 回复时间:2008-05-02 15:18 ]   [引用]   [回复]   [ top ] 
荣誉值:10
信誉值:0
注册日期:2008-03-22 20:52
都象你这种学习速率,真的中国计算机的发展就要坐火箭了!!!!!!!!!!!!!!!!!!!!
tsql863
[第6楼]   [ 回复时间:2008-05-02 23:32 ]   [引用]   [回复]   [ top ] 
荣誉值:10
信誉值:0
注册日期:2008-03-22 20:52
实验16要求写成中断例程并安装,怎么我看你写的不是中断例程,而是子程序.
tsql863
[第7楼]   [ 回复时间:2008-05-02 23:32 ]   [引用]   [回复]   [ top ] 
荣誉值:10
信誉值:0
注册日期:2008-03-22 20:52
改为爆破吧,不要用突破.
nokiahc
[第8楼]   [ 回复时间:2008-06-02 17:56 ]   [引用]   [回复]   [ top ] 
荣誉值:2
信誉值:10
注册日期:2008-05-18 20:29
回复:[第6楼]
------------------
...你没看仔细吧?
hualongmian
[第9楼]   [ 回复时间:2008-06-06 12:50 ]   [引用]   [回复]   [ top ] 
荣誉值:6
信誉值:0
注册日期:2008-05-13 20:29
呵呵,兄台,试问一下。
sub1,sub2,sub3,sub4不过是操作符,是由编译器识别的。那么此代码,编译器编译时,按现行的内存单元取得各标号的偏移地址存放到table表中,那么当把此代码复制到其它地方时?call的是原安装程序中的各标号的地址呢?还是中断例程中的???
我开始跟你一样,一下就写出来了。可运行就出错了。最后才想出是这里的问题,call指向了一个错误的地址。
兄台可还记得跟据位移转移的作用?
w0922
[第10楼]   [ 回复时间:2008-06-11 11:31 ]   [引用]   [回复]   [ top ] 
荣誉值:4
信誉值:5
注册日期:2007-11-13 22:57
回复:[第3楼]
------------------
学习贵在坚持,不放弃!
------------------
回复:xiaochong 大哥的话 跪在坚持·
cairulong
[第11楼]   [ 回复时间:2008-06-25 18:06 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2008-04-27 16:45
注册时间与发贴时间相差好远!
titanlxf
[第12楼]   [ 回复时间:2008-07-03 19:36 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2008-05-05 06:57
回复:[第9楼] 问的好,这两天正为此问题郁闷呢,知道是调用地址错误,就是找不出问题出处,一说才明白了!
a313446264
[第13楼]   [ 回复时间:2008-07-04 17:53 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:8
注册日期:2008-06-20 21:12
同意11楼的
shifuzhuang
[第14楼]   [ 回复时间:2008-09-21 08:54 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2008-07-09 11:14
很好。我的理解是:
为了使编译器生成的编号 与 中断在内存空间的编号相一致,采取了两条措施:1 安装程序中将中断代码移到前面,使第一条指令标号在编译时位移为0;  将cs改为20h,ip改为0, 使得中断程序在执行时能用上编译器生成的编号,同时也没有改变 中断代码在内存的实际位置. 因为 0000:0200 与 0020:0000 是同一位置. 
  这样设计才能用上本章的典型命令: call word ptr table[bx]
dengcg
[第15楼]   [ 回复时间:2008-10-23 10:40 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2008-10-15 19:31
最不喜欢浮躁的。
aukeys
[第16楼]   [ 回复时间:2008-12-01 00:48 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2008-11-08 21:55
0000:0200 与 0020:0000 是同一位置. 这个我不太明白
aukeys
[第17楼]   [ 回复时间:2008-12-01 00:57 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2008-11-08 21:55
0000:0200 与 0020:0000 是同一位置,明白了,好像学了这么久最基本的竟然给忘了
sb123
[第18楼]   [ 回复时间:2008-12-20 23:46 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2008-12-06 07:47
你傻的啊~~~看看你自已的注册时间 6个月吧 说谎话之前别忘记把尾巴收好啊 别在这里侮辱我们的智慧啊!!!!!
suiyueran
[第19楼]   [ 回复时间:2009-02-03 18:24 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2009-01-31 16:41
调试了两天 终于成功 
assume cs:code 
code segment 
start:mov ax,cs 
    mov ds,ax 
    mov si,offset screen   
    mov ax,0 
    mov es,ax 
    mov di,200h 
    mov cx,offset screenend-offset screen 
    cld 
    rep movsb 
    mov word ptr es:[7ch*4],200h 
    mov word ptr es:[7ch*4+2],0 
  
     
     
          mov ax,4c00h 
          int 21h 

;=========screen=====     
screen:jmp short set 
   table dw  offset sub1-offset screen+200h ,offset sub2-offset screen+200h, offset sub3-offset screen+200h , offset sub4-offset screen+200h                     
 set:push bx  
     
    cmp ah,3 
    ja sret     
    mov bl,ah 
    mov bh,0 
    add bx,bx 
     
    call word ptr cs:[bx].202h 
    sret:pop bx 
    iret             
     
;-----------sub1===== 
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====== 
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    ----- 
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     ===== 
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 
screenend:nop         
code ends 
    end start                         
大家多多指教
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved