鱼C论坛

 找回密码
 立即注册
查看: 1249|回复: 11

[已解决]实验十

[复制链接]
发表于 2022-7-11 22:57:05 | 显示全部楼层 |阅读模式

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

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

x
问题: 执行到div指令也就是第25行的时候就会莫名跳转到别的地方,如图
1.png
代码如下:
  1. assume cs: codesg, ds: data

  2. data segment
  3.     db 'hard hard study day day up', 0
  4.     db 4ah, 0a0h, 0ah, 0 ; 4ah为字符串属性(偏移地址为1bh), 0a0h是160的16进制(偏移地址为1ch), 0ah是10的16进制(偏移地址为1dh)
  5. data ends

  6. codesg segment
  7.     start:
  8.         mov ax, data
  9.         mov ds, ax
  10.         mov ch, 8 ; 设置显示位置为第八行
  11.         mov cl, 3 ; 设置显示位置为第三列
  12.         mov ax, 8000h
  13.         mov dx, 0bh ; 显存物理地址为b8000, 用dx存放高位,ax存放低位
  14.         mov es, ax
  15.         xor ax, ax
  16.         sub ch, 1
  17.         mov al, ch
  18.         mul byte ptr ds:[1ch]   ; 跳过前面七行
  19.         mov bx, es
  20.         add ax, bx
  21.         sub cl, 1
  22.         add al, cl; 跳过前面两列
  23.         div word ptr ds:[1dh] ; 商存放到ax, 余数存放到dx
  24.         mov di, dx ; 将初始偏移地址赋给di
  25.         mov es, ax ; 将目的段地址赋给es
  26.         xor si, si ; si用于索引字符串
  27.         call show_str
  28.         mov ax, 4c00h
  29.         int 21h
  30.     show_str:
  31.         mov ch, 0 ; 利用cx判断是否到达字符串末端
  32.         mov cl, ds:[si] ; 取出字符
  33.         jcxz ok ; 判断字符是否为0
  34.         mov es:[di], cl
  35.         inc di ; 定位下一个目的地址
  36.         inc si ; 定位下一个字符
  37.         mov al, ds:[1bh] ; 取出字符属性
  38.         mov es:[di], al
  39.         inc di
  40.         jmp short show_str
  41.     ok:
  42.         ret
  43. codesg ends
  44. end start
复制代码
最佳答案
2022-7-12 09:09:44
1. 实验十是什么?把题目发出来呀
你不发出来,让别人去找你问题的题目,这样太费时间了
解决你的问题也就几分钟的时间,去找你问题的题目的时间,至少十几分钟,这是至少
我学完汇编语言已经过去很长很长时间了,不可能记得实验十是什么
学汇编语言的时候用的还是windows系统(已经忘了是windows几了),现在已经用linux系统了
我要找到之前学汇编语言的那些资料的难度至少在半个小时以上
也就是说,你不把题目发出来,而是让我们自己去找
那我们很有可能会放弃回答这个问题,毕竟要花的时间实在是太多了

2. 看你的图片中
div 是 DX:AX / DS:[1D]
就是16位除法
DX:AX 的内容是 B8462
DS:[1D] 的内容是 A

B8462 / A 的商是 126D6
余数是 6
执行完 div word ptr [001d] 后,把商 126D6 存放在AX寄存器中,把余数 6 存放在DX寄存器中
但是你有没有发现一个问题?
把商 126D6 存放在AX寄存器中
AX可以保存下 126D6 吗?
没错,除法溢出了,可以想到 F000:1060 的位置是除法溢出的处理程序
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-7-11 23:43:45 | 显示全部楼层

回帖奖励 +4 鱼币

         你这个代码的意图是什么,用直接写屏技术,按照 4ah 的显示属性,把字符串 'hard hard study day day up' 显示到屏幕上的第 8 行,第 3 列开始的位置?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-7-12 09:09:44 | 显示全部楼层    本楼为最佳答案   

回帖奖励 +4 鱼币

1. 实验十是什么?把题目发出来呀
你不发出来,让别人去找你问题的题目,这样太费时间了
解决你的问题也就几分钟的时间,去找你问题的题目的时间,至少十几分钟,这是至少
我学完汇编语言已经过去很长很长时间了,不可能记得实验十是什么
学汇编语言的时候用的还是windows系统(已经忘了是windows几了),现在已经用linux系统了
我要找到之前学汇编语言的那些资料的难度至少在半个小时以上
也就是说,你不把题目发出来,而是让我们自己去找
那我们很有可能会放弃回答这个问题,毕竟要花的时间实在是太多了

2. 看你的图片中
div 是 DX:AX / DS:[1D]
就是16位除法
DX:AX 的内容是 B8462
DS:[1D] 的内容是 A

B8462 / A 的商是 126D6
余数是 6
执行完 div word ptr [001d] 后,把商 126D6 存放在AX寄存器中,把余数 6 存放在DX寄存器中
但是你有没有发现一个问题?
把商 126D6 存放在AX寄存器中
AX可以保存下 126D6 吗?
没错,除法溢出了,可以想到 F000:1060 的位置是除法溢出的处理程序
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-7-12 09:27:53 | 显示全部楼层
中断处理程序的那个 fe 38 确实不知道是什么
我看了一下我这边
如果没有运行dos操作系统,这个除法溢出中断的位置只有一个 iret
如果运行dos操作系统,这个位置就是dos提供的除法溢出中断的处理程序,由nop指令开始
  1. (0) [0x0000fffffff0] f000:fff0 (unk. ctxt): jmpf 0xf000:e05b          ; ea5be000f0
  2. <bochs:1> b 0x7c00
  3. <bochs:2> c
  4. (0) Breakpoint 1, 0x0000000000007c00 in ?? ()
  5. Next at t=412124554
  6. (0) [0x000000007c00] 0000:7c00 (unk. ctxt): xor ax, ax                ; 33c0
  7. <bochs:3> info ivt 0
  8. INT# 00 > F000:FF53 (0x000fff53) DIVIDE ERROR ; dummy iret
  9. <bochs:4> u/3 0x000fff53
  10. 00000000000fff53: (                    ): iret                      ; cf
  11. 00000000000fff54: (                    ): mov dx, 0x0400            ; ba0004
  12. 00000000000fff57: (                    ): mov ax, 0x2e06            ; b8062e
  13. <bochs:5> c
  14. (0) Breakpoint 1, 0x0000000000007c00 in ?? ()
  15. Next at t=412126790
  16. (0) [0x000000007c00] 0000:7c00 (unk. ctxt): jmp .+60  (0x00007c3e)    ; eb3c
  17. <bochs:6> c
  18. ^CNext at t=594620446
  19. (0) [0x000000000e43] 0070:0743 (unk. ctxt): cmp byte ptr cs:0x000d, 0x00 ; 2e803e0d0000
  20. <bochs:7> info ivt 0
  21. INT# 00 > 0116:108A (0x000021ea) DIVIDE ERROR
  22. <bochs:8> u/3 0x000021ea
  23. 00000000000021ea: (                    ): nop                       ; 90
  24. 00000000000021eb: (                    ): nop                       ; 90
  25. 00000000000021ec: (                    ): call .+224  (0x000022cf)  ; e8e000
  26. <bochs:9>
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-7-12 09:37:06 | 显示全部楼层
看这个除法溢出处理程序的地址由F开头,也就是这个除法溢出处理程序是由bios rom提供的,你用的哪个版本的 bios rom
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-7-12 10:14:22 | 显示全部楼层
人造人 发表于 2022-7-12 09:09
1. 实验十是什么?把题目发出来呀
你不发出来,让别人去找你问题的题目,这样太费时间了
解决你的问题也 ...

题目:
3.png
下次我一定记得发题目
我用的dosbox,我不太了解bios rom,我查了一下电脑的bios版本:
2.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-7-12 10:21:18 | 显示全部楼层
本帖最后由 6YKT6ZKm5LqI 于 2022-7-12 10:27 编辑
人造人 发表于 2022-7-12 09:09
1. 实验十是什么?把题目发出来呀
你不发出来,让别人去找你问题的题目,这样太费时间了
解决你的问题也 ...


啊,这个除法我想错了,我以为这个除法的商就是b846,然后余数是2, 问题应该就在这里,我去改改看还有没有问题
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-7-12 10:31:51 | 显示全部楼层
6YKT6ZKm5LqI 发表于 2022-7-12 10:21
啊,这个除法我想错了,我以为这个除法的商就是b846,然后余数是2, 问题应该就在这里,我去 ...

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-7-12 11:23:24 | 显示全部楼层
6YKT6ZKm5LqI 发表于 2022-7-12 10:14
题目:

下次我一定记得发题目

你理解错题意了,题目是要你写一个show_str的函数(子程序),把字符串用指定的颜色显示到指定的位置
把字符串用指定的颜色显示到指定的位置,这件事全部由show_str这个函数来做
我调用这个函数的时候,告诉这个函数 行号、列号、颜色和字符串的首地址,这个函数用这些信息把字符串正确的显示出来
像下面这样的

我从前的汇编语言学习环境不能用了(或者说成是要用这个环境的代价太高了)
我用现在的汇编语言学习环境给你写了一下这个题目,你可以看看
  1.     .code16
  2.     .globl  _start
  3. _start:
  4.     pushw   $0x07c0
  5.     popw    %ds

  6.     movb    $11, %dh
  7.     movb    $34, %dl
  8.     movb    $2, %cl
  9.     movw    $str0, %si
  10.     callw   show_str

  11.     movb    $13, %dh
  12.     movb    $24, %dl
  13.     movb    $4, %cl
  14.     movw    $str1, %si
  15.     callw   show_str

  16. 1:  cli
  17.     hlt
  18.     jmp 1b

  19. # 名称:show_str
  20. # 功能:在指定的位置,用指定的颜色,显示一个用0结束的字符串
  21. # 参数:(dh)=行号(取值范围0~24)
  22. #       (dl)=列号(取值范围0~79)
  23. #       (cl)=颜色
  24. #       ds:si指向字符串的首地址
  25. # 返回:无
  26. show_str:
  27.     pushw   %es
  28.     pushw   %ax
  29.     pushw   %di
  30.     pushw   %si

  31.     # dh大于24直接返回
  32.     # dl大于79直接返回
  33.     cmpb    $24, %dh
  34.     ja      1f
  35.     cmpb    $79, %dl
  36.     ja      1f

  37.     # di = dh * 160 + dl * 2
  38.     movb    $160, %al
  39.     mulb    %dh
  40.     movw    %ax, %di
  41.     movb    $2, %al
  42.     mulb    %dl
  43.     addw    %ax, %di

  44.     # es指向显存
  45.     pushw   $0xb800
  46.     popw    %es

  47.     # ah保存显示属性
  48.     # al保存显示字符
  49.     movb    %cl, %ah
  50. 2:  movb    (%si), %al      # 从ds:si的位置取一个字符到al
  51.     incw    %si             # si += 1

  52.     # 取到的字符是0就退出
  53.     cmpb    $0, %al
  54.     je      1f

  55.     movw    %ax, %es:(%di)  # 把ax中的数据写到es:di的位置
  56.     addw    $2, %di         # di += 2
  57.     jmp     2b
  58. 1:
  59.     popw    %si
  60.     popw    %di
  61.     popw    %ax
  62.     popw    %es
  63.     retw

  64. str0:    .string "hello world!"
  65. str1:    .string "AS - the portable GNU assembler"
复制代码


1.png

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +3 收起 理由
6YKT6ZKm5LqI + 5 + 5 + 3 鱼C有你更精彩^_^

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-7-12 11:50:30 | 显示全部楼层

回帖奖励 +4 鱼币

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-7-12 12:17:05 | 显示全部楼层

回帖奖励 +4 鱼币

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-7-13 09:09:25 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-25 01:29

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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