鱼C论坛

 找回密码
 立即注册
查看: 2677|回复: 2

[汇编作业] 检测点13.1

[复制链接]
发表于 2019-3-12 11:34:10 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 奥普瓯江 于 2019-3-12 11:33 编辑

(1)在上面的内容中,我们用7ch中断例程实现loop的功能,则上面的7ch中断例程所能进行的最大转移位移是多少?
答:最大的转移位移是FFFFH,个人判断,bx能储存的最大16位数就是他能储存的最大位移。



(2)用7ch中断例程完成jmp near ptr s 指令的功能,用bx向中断例程传送转移位移。


  1. assume cs:code, ds:data

  2. data segment
  3.                 db 'conversation', 0
  4. data ends

  5. code segment
  6. start:
  7.                 mov ax, data
  8.                 mov ds, ax
  9.                 mov si, 0
  10.                 mov ax, 0b800h
  11.                 mov es, ax
  12.                 mov di, 12*160
  13. s:
  14.                 cmp byte ptr [si], 0
  15.                 je ok                        ;如果是0跳出循环
  16.                 mov al, [si]
  17.                 mov es:[di], al
  18.                 inc si
  19.                 add di, 2
  20.                 mov bx, offset s-offset ok                ;设置从标号ok到标号s的转移位移
  21.                 int 7ch                                                        ;转移到标号s处
  22. ok:
  23.                 mov ax, 4C00h
  24.                 int 21h
  25.                
  26. code ends
  27. end start
复制代码



答:以下为模拟 jmp near ptr s 命令的int 7ch程序

  1. assume cs:code

  2. code segment
  3. start:                                                                                        ;寻找到原始数据地址
  4.                 mov ax, cs
  5.                 mov ds, ax
  6.                 mov si, offset text_1
  7.                
  8.                 mov ax, 0                                                                ;定位目标地址
  9.                 mov es, ax
  10.                 mov di, 200h
  11.                
  12.                 mov cx, offset text_2 - offset text_1                 ;计算数据数量rep movsb循环所用
  13.                
  14.                 cld                                                                                        ;累加循环
  15.                 rep movsb
  16.                                                                                                         ;镶入中断7Ch中
  17.                 mov ax, 0
  18.                 mov es, ax
  19.                 mov word ptr es:[7ch * 4], 200h
  20.                 mov word ptr es:[7ch * 4 + 2], 0h
  21.                
  22.                 mov ax, 4c00h
  23.                 int 21h
  24. text_1:                                                                        ;数据段
  25.                 push bp                                                        ;临时调用bp所以需要把前期的数据先放入站中储存
  26.                 mov bp, sp
  27.                 add word ptr ss:[bp + 2], bx                ;直接在栈中更改数据,bp默认的段寄存器是ss
  28.                 pop bp                                                        ;放入站中临时储存的bp数据释放出来
  29.                 iret
  30. text_2:
  31.                 nop                                        ;只是为了占位所以设置的本标致供cx计算使用
  32. code ends
  33. end start
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-12-26 17:35:33 | 显示全部楼层
第一题
位移有方向的,应该是用补码表示吧
如果是补码那就是-30768~30761
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-1-2 10:30:51 | 显示全部楼层
燃烧的飞星 发表于 2019-12-26 17:35
第一题
位移有方向的,应该是用补码表示吧
如果是补码那就是-30768~30761

你那是10进制的我这是16进制的,16进制的范围为0000-FFFF,内存表示无正负数,只有地址,你这种表示也对的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-22 22:55

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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