王爽 汇编第二版 第十六章 实验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
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
当年我也发现这个程序有问题,自己研究了一下用另外的方法解决的,给你参考一下。
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
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28