+ -
当前位置:首页 → 问答吧 → 王爽 汇编第二版 第十六章 实验16疑惑

王爽 汇编第二版 第十六章 实验16疑惑

时间:2011-10-21

来源:互联网

感叹号里面的内容是网上找到 补上的 没用那一句跟踪中断程序CALL的入口地址就错误,我很想知道为什么要补上ORG指定下一条指令的偏移,本人汇编初学者,希望大牛们别见笑,帮我解答下。

assume cs:code

code segment

start: mov ax,cs ;安装中断例程和中断向量表
  mov ds,ax
  mov si,offset setscreen

  mov ax,0
  mov es,ax
  mov word ptr es:[7ch*4],200h
  mov word ptr es:[7ch*4+2],0
  mov di,200h
  mov cx,offset setscreenend-offset setscreen
  cld
  rep movsb

  mov ax,4c00h
  int 21h
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ORG 200H ;此程序的点睛之笔,
  ;伪指令,表示下一条指令从偏移地址200H开始,正好和安装后的偏移地址相同
  ;因为如果没有ORG 200H,此中断例程被安装以后,标号所代表的地址变了,和之前编译器编译的有别
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
;===========================================================================
setscreen: jmp short set

  table dw sub1,sub2,sub3,sub4 ;中断程序

set: push bx
  push ax  

  cmp ah,3
  ja sret
  mov bl,ah
  mov bh,0
  add bx,bx
  call word ptr table[bx]

sret: pop ax
  pop bx
  iret
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
sub1: push es
  push di ;中断子程序清屏
  push cx

  mov ax,0b800h
  mov es,ax
  mov di,0
  mov cx,4000
sub1s: mov byte ptr es:[di],' '
  add di,2
  loop sub1s

  pop cx
  pop di
  pop es
  ret
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
sub2: push bx
  push es ;中断子程序至前景颜色
  push cx
   
  mov bx,0b800h
  mov es,bx
  mov bx,1
  mov cx,4000
sub2s: and byte ptr es:[bx],11111000b
  or es:[bx],al
  add bx,2
  loop sub2s

  pop cx
  pop es
  pop bx
  ret
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
sub3: push bx
  push es ;中断子程序至背景颜色
  push cx
   
  mov bx,0b800h
  mov es,bx
  mov bx,1
  mov cl,4
  shl al,cl
  mov cx,4000
sub3s: and byte ptr es:[bx],10001111b
  or es:[bx],al
  add bx,2
  loop sub3s

  pop cx
  pop es
  pop bx
  ret
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
sub4: push ds  
  push si ;中断子程序向上滚动一行
  push es
  push di
  push cx

  mov si,0b800h
  mov ds,si
  mov es,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 es:[160*24+si],' '
  add si,2
  loop sub4s1

  pop cx
  pop di
  pop es
  pop si
  pop ds
  ret

setscreenend: nop
;===========================================================================
code ends
end start

作者: az138204214   发布时间: 2011-10-21

兄弟,感叹号里面的注释已经解释了啊
当年我也发现这个程序有问题,自己研究了一下用另外的方法解决的,给你参考一下。

int7ch: jmp short set
;table dw sub1, sub2, sub3, sub4
;此处不能使用如上的地址表,
;因为加载到0:200处后与编译器计算的不同
;采取在debug 下用u 命令看的方法,得到如下地址表
table dw 021dh, 0238h, 0256h, 0278h
set: push bx

作者: vcnewer   发布时间: 2011-10-22