找回密码
 立即注册
搜索
热搜: 活动 通知
查看: 536|回复: 3

第9章习题

[复制链接]

630

主题

361

回帖

1734

积分

管理员

积分
1734
发表于 2026-3-15 09:34:19 | 显示全部楼层 |阅读模式
第9章习题

1.修改本章源程序9-2,在不使用retf指令的情况下,从段code_1转移到段code_2执行。
答:可直接将retf改成以下两行
    mov bp,sp
    call far [bp]
由于栈不平衡,所以不够优雅。可以考虑在数据段定义2个双字,分别保存目标位置的偏移地址和段地址,然后用jmp far指令跳转。比如:
(1),修改第二个数据段如下
SECTION data_2 align=16 vstart=0

    msg1 db '  The above contents is written by LeeChung. '
         db '2011-05-06'
         db 0

    buff dw 0,0                ;添加此行

(2),修改第二个代码段,注释掉原先的行,添加新指令。
SECTION code_2 align=16 vstart=0          ;定义代码段2(16字节对齐)

  begin:
         ;push word [es:code_1_segment]
         ;mov ax,continue
         ;push ax                          ;可以直接push continue,80386+

         ;retf                             ;转移到代码段1接着执行
         mov word [buff], continue
         mov ax,[es:code_1_segment]
         mov [buff+2],ax
         jmp far [buff]


2.思考一下,如果去掉代码清单9-1的第38、39行,会发生什么情况?
     答:如果cx为0就不需要再读取了,但在下面的代码里,因为loop是先减1再判断,0减1得到65535,所以loop循环将执行65536次。


0

主题

9

回帖

48

积分

新手上路

积分
48
发表于 2026-7-17 17:29:32 | 显示全部楼层
本帖最后由 请你不要睡懒觉 于 2026-7-17 17:45 编辑

李老师,以下仅供交流:
(1)第一题中:可以考虑在数据段定义2个双字。   这里应该是只要2个字就可以吧。。。
(2)你这个是在第二个数据段定义的两个字空间,下面直接用jmp far [buff]好像不太行吧,此时ds还指向的是第一个数据段,你应该是想在第一个数据段定义的空间吧。

630

主题

361

回帖

1734

积分

管理员

积分
1734
 楼主| 发表于 2026-7-19 09:58:31 | 显示全部楼层
请你不要睡懒觉 发表于 2026-7-17 17:29
李老师,以下仅供交流:
(1)第一题中:可以考虑在数据段定义2个双字。   这里应该是只要2个字就可以吧。 ...

1,是的;
2,应当在第二个数据段定义,但如你所说,需要切换段寄存器。

0

主题

9

回帖

48

积分

新手上路

积分
48
发表于 2026-7-21 16:22:15 | 显示全部楼层
站长 发表于 2026-7-19 09:58
1,是的;
2,应当在第二个数据段定义,但如你所说,需要切换段寄存器。 ...

哦哦,谢谢李老师的负责和回复
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|鼠侠网 ( 吉ICP备19001332号 )

GMT+8, 2026-8-31 22:53 , Processed in 0.566669 second(s), 19 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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