鱼C论坛

 找回密码
 立即注册
查看: 3209|回复: 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)
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

  22. sub1:               
  23. sub1s:
  24. sub1ret:
  25. sub2:
  26. sub2s:
  27. sub2ret:
  28. sub3:
  29. sub3s:
  30. sub3ret:
  31. sub4:
  32. sub4s:
  33. sub4ret:
  34. setscreenend:nop
  35. ;----7ch中断例程 iret----

  36. code ends
  37. 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
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-13 13:46

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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