鱼C论坛

 找回密码
 立即注册
查看: 2468|回复: 1

[汇编作业] 第16章检测实验及笔记

[复制链接]
发表于 2016-4-19 11:43:35 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
直接定址表
标号+冒号 ,称地址标号,仅仅表示偏移地址,只能在代码段中使用!
标号 不加冒号,称数据标号,标记了存储数据的单元的地址和长度!用法 标号[bx] , 标号[si] , 标号[常数] , 可以在各段中使用,需要伪指令例如assume ds:data关联,代码中也要设置ds指向data

将标号当作数据来定义,如:
a db 1,2,3
b dw 0
c dw a,b ----c处存2个word数据,值为offset a 和 offset b
d dd a,b ----d处存2个双字型数据,值分别为a、b的偏移地址和段地址(相当于 d dw offset a,seg a,offset b, seg b)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2016-4-19 12:04:24 | 显示全部楼层
实验16,看上去和书上16.4的setscreen一样,其实有一个大陷阱。
;任务:一个新的int 7ch中断例程,为显示输出提供子程序
;参数: (ah) 功能号:0清屏,1设前景色,2设背景色,3上滚一行
;                        (al) 颜色值,0~7
assume cs:code , ds:data , ss:stack
code segment
strat:
                ;1.安装到内存ds:si -> es:di
                ;2.改向量表
                ;3.结束安装程序
                mov ax,4c00h
                int 21h
                
;----7ch中断例程 ----
setscreen:
                jmp short main
                ;直接定址表
                table dw sub1,sub2,sub3,sub4
main:
                ;用表中数据调用子程序
                call word ptr table[bx]
mainiret:

sub1:                
sub1s:
sub1ret:
sub2:
sub2s:
sub2ret:
sub3:
sub3s:
sub3ret:
sub4:
sub4s:
sub4ret:
setscreenend:nop
;----7ch中断例程 iret----

code ends
end start
问题就在table dw sub1,sub2,sub3,sub4 , call word ptr table[bx]这两句。在安装程序运行时,sub和table都是指在安装程序中的偏移!!!
要解决这问题,可以把程序结构改变一下,
1.将中断的代码放到start前,那么在cs段中,table ,sub 就是从0开始的偏移
2.在向量表中,让ip也从0开始,即20h:0,不用0:200h
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-6-18 11:09

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表