鱼C论坛

 找回密码
 立即注册
查看: 5615|回复: 20

[争议讨论] 第15章外中断例子中遇到的问题

[复制链接]
发表于 2020-4-8 11:32:04 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 项羽姓秦 于 2020-4-8 11:33 编辑

在我学习第十五章外中断做例子实践的时候遇到了一个问题;

题目为:在屏幕依次显示‘a’~‘z’字符串;

然而我根据书中的代码进行编译,却发现结果与书中有所不同;(附代码和结果)

  1. assume cs:code
  2. stack segment
  3.         db 128 dup (0)
  4. stack ends
  5. code segment
  6. start:
  7.         mov ax,stack
  8.         mov ss,ax
  9.         mov sp,128
  10.        
  11.         mov ax,0b800h
  12.         mov es,ax
  13.         mov ah,'a'
  14. s:        mov es:[160*12+40*2],ah
  15.         call delay
  16.         inc ah
  17.         cmp ah,'z'
  18.         jna s
  19.         mov ax,4c00h
  20.         int 21h

  21. delay:
  22.         push ax
  23.         push dx
  24.         mov dx,1000h
  25.         mov ax,0
  26. s1: sub ax,1
  27.         sbb dx,0
  28.         cmp ax,0
  29.         jne s1
  30.         cmp dx,0
  31.         jne s1
  32.         pop dx
  33.         pop ax
  34.         ret
  35.        
  36. code ends
  37. end start
  38.        
复制代码


结果却只显示字符串‘a’;让我纠结百般啊!!

微信截图_20200408102102.png

后来也渗入探究,慢慢排查的办法,终于让我发现了问题的存在;(附代码和结果)

  1. assume cs:code
  2. stack segment
  3.         db 128 dup (0)
  4. stack ends
  5. code segment
  6. start:
  7.         mov ax,stack
  8.         mov ss,ax
  9.         mov sp,128
  10.        
  11.         mov ax,0b800h
  12.         mov es,ax
  13.         mov ah,'a'
  14. s:        mov es:[160*12+40*2],ah
  15.         call delay
  16.         inc ah
  17.         cmp ah,'z'
  18.         jna s
  19.         mov ax,4c00h
  20.         int 21h

  21. delay:
  22.         push ax
  23.         push dx
  24.         mov dx,5h
  25.         mov ax,0
  26. s1: sub ax,1
  27.         sbb dx,0
  28.         cmp ax,0
  29.         jne s1
  30.         cmp dx,0
  31.         jne s1
  32.         pop dx
  33.         pop ax
  34.         ret
  35.        
  36. code ends
  37. end start
  38.        
复制代码


结果终于与书中所说一致;

QQ截图20200408102028.png

不同之处在于那个延缓的时间,就是书中所说的1000万次循环。mov dx,100h

我改为:mov dx,5h

最终正常运行;

但是我还是有一事不明白的,那就是为什么书中所处理的是1000h,而我处理的只需要5h就可以了?
请大神分析一二,感谢!
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-4-8 13:13:38 From FishC Mobile | 显示全部楼层
可惜,16位中断技术现在所有系统都用不了
学来无用
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-8 14:32:31 | 显示全部楼层
wp231957 发表于 2020-4-8 13:13
可惜,16位中断技术现在所有系统都用不了
学来无用



打击好大啊。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-8 14:35:15 From FishC Mobile | 显示全部楼层
项羽姓秦 发表于 2020-4-8 14:32
打击好大啊。

真的,不是假的,你可以学一下基本语法,循环,跳转,各种比较指令,涉及中断的就可以pass了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-8 15:01:36 | 显示全部楼层
wp231957 发表于 2020-4-8 14:35
真的,不是假的,你可以学一下基本语法,循环,跳转,各种比较指令,涉及中断的就可以pass了

我不认可这种说法,如果学汇编语言只是为了理解C语言,那确实不需要中断
破解也不需要
但是学操作系统呢?
学操作系统,你说你不理解8086的中断系统?怎么可以?
你想理解一台计算机的运行原理,没有8086中断系统也不行
学单片机也有中断系统,和8086确实有区别,但是原理完全一样
和底层硬件打交道,你就不能不明白8086的中断系统,或者说中断系统
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-8 15:24:57 | 显示全部楼层
循环的次数和cpu的主频有关,主频越高,执行程序越快,你就需要越多的循环次数
举个例子,对于1Mhz的处理器,你打算延时10秒,循环了10次
但是对于1Ghz的处理器,10次循环只用了1毫秒就完成了,所以你需要更多的次数来让处理器在这里循环,以达到延时

反之也一样,处理器主频低,你就需要少的循环次数
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-8 15:33:49 | 显示全部楼层
在我这边(虚拟机+xp)
1000h的循环次数都有点太少,都有点看不清显示的字母,在我这边2000h感觉差不多

  1. assume cs:code
  2. stack segment
  3.         db 128 dup (0)
  4. stack ends
  5. code segment
  6. start:
  7.         mov ax,stack
  8.         mov ss,ax
  9.         mov sp,128
  10.         
  11.         mov ax,0b800h
  12.         mov es,ax
  13.         mov ah,'a'
  14. s:      mov es:[160*12+40*2],ah
  15.         call delay
  16.         inc ah
  17.         cmp ah,'z'
  18.         jna s
  19.         mov ax,4c00h
  20.         int 21h

  21. delay:
  22.         push ax
  23.         push dx
  24.         mov dx,2000h
  25.         mov ax,0
  26. s1:     sub ax,1
  27.         sbb dx,0
  28.         cmp ax,0
  29.         jne s1
  30.         cmp dx,0
  31.         jne s1
  32.         pop dx
  33.         pop ax
  34.         ret
  35.         
  36. code ends
  37. end start
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-8 20:15:58 From FishC Mobile | 显示全部楼层
人造人 发表于 2020-4-8 15:01
我不认可这种说法,如果学汇编语言只是为了理解C语言,那确实不需要中断
破解也不需要
但是学操作系统 ...

也许你是对的,但是写操作系统,对于我这个业余爱好来说,有好些光年那么远
想想华为那么多牛人,也不知道打着中国 logo的操作系统弄没弄出来呢
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-8 20:18:46 | 显示全部楼层
wp231957 发表于 2020-4-8 20:15
也许你是对的,但是写操作系统,对于我这个业余爱好来说,有好些光年那么远
想想华为那么多牛人,也不知 ...

确实操作系统这门课程也不算难,只是需要好多基础
我现在还写不出操作系统,我还缺少好多基础的东西
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-8 20:25:44 From FishC Mobile | 显示全部楼层
人造人 发表于 2020-4-8 20:18
确实操作系统这门课程也不算难,只是需要好多基础
我现在还写不出操作系统,我还缺少好多基础的东西

我是随着兴趣走,c语言都好久没碰了
因为突然发现它没有脚本语言好玩
目前在研究nodejs+mysql构建前后端
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-8 20:26:23 | 显示全部楼层
wp231957 发表于 2020-4-8 14:35
真的,不是假的,你可以学一下基本语法,循环,跳转,各种比较指令,涉及中断的就可以pass了

好的,感谢你的提议
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-8 20:28:52 | 显示全部楼层
人造人 发表于 2020-4-8 15:24
循环的次数和cpu的主频有关,主频越高,执行程序越快,你就需要越多的循环次数
举个例子,对于1Mhz的处理 ...

原来是这样,明白了;
原来是我的电脑配置问题!!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-8 20:30:26 | 显示全部楼层
wp231957 发表于 2020-4-8 20:15
也许你是对的,但是写操作系统,对于我这个业余爱好来说,有好些光年那么远
想想华为那么多牛人,也不知 ...

其实只是写一个操作系统不难,难的是如何把windows的应用程序移植过去
没有应用软件的操作系统,很难让人们接受
像ubuntu,做的是不错,但是有好多windows应用程序在ubuntu或其他linux中都没有,也找不到替代品
例如CAD软件
这些软件要想在linux用,就只能装虚拟机,本质还是运行在windows下
这些软件在虚拟机中运行很卡,所以我选择把我的学习环境放到虚拟机中,物理主机是windows

所以说,操作系统不难做,难的是应用软件
难的不是去移植某一个应用软件,难的是移植全部的应用软件
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-8 20:31:06 | 显示全部楼层
wp231957 发表于 2020-4-8 20:25
我是随着兴趣走,c语言都好久没碰了
因为突然发现它没有脚本语言好玩
目前在研究nodejs+mysql构建前后 ...

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-8 20:31:45 | 显示全部楼层
wp231957 发表于 2020-4-8 20:25
我是随着兴趣走,c语言都好久没碰了
因为突然发现它没有脚本语言好玩
目前在研究nodejs+mysql构建前后 ...

我现在在玩编译原理
^_^
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-8 20:32:26 | 显示全部楼层
wp231957 发表于 2020-4-8 20:25
我是随着兴趣走,c语言都好久没碰了
因为突然发现它没有脚本语言好玩
目前在研究nodejs+mysql构建前后 ...

我c语言也很久没碰了,之前都学了c语言,java,JavaScript,HTML和css,现在想接触一下破解。
所以也是从底层学起。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-8 20:34:22 From FishC Mobile | 显示全部楼层
人造人 发表于 2020-4-8 20:30
其实只是写一个操作系统不难,难的是如何把windows的应用程序移植过去
没有应用软件的操作系统,很难让 ...

我也想玩虚拟机呢,可是实力不允许啊,不论单位电脑还是家电脑,都伤不起啊
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-8 20:36:23 | 显示全部楼层
项羽姓秦 发表于 2020-4-8 20:28
原来是这样,明白了;
原来是我的电脑配置问题!!

不是你的电脑配置问题,是你用的dosbox,是dosbox的虚拟处理器主频太低
你可以通过百度去找到修改dosbox主频的方法,我认为这玩意可以修改,我没试过,^_^
不过好像明白了问题所在以后,也没必要去修改这玩意,毕竟又不是慢到难以接受
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-8 20:43:10 | 显示全部楼层
wp231957 发表于 2020-4-8 20:34
我也想玩虚拟机呢,可是实力不允许啊,不论单位电脑还是家电脑,都伤不起啊

确实,玩这些东西对电脑的配置要求确实高,我这台电脑已经上了10k了
而且现在也还是不能玩fpga,配置还是不够,后来我一直都没有去试,只是刚买这台的时候试了,quartus速度太慢
按下编译按钮后,接下来的一分钟你等着就行了,什么事也不用做,^_^
我受不了这个速度,所以一直没有回去(回到fpga),fpga我只是入了个门
不知道现在这个软件优化的如何了,反正我现在在学编译原理,还不想回去
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-8 22:58:36 | 显示全部楼层
人造人 发表于 2020-4-8 20:36
不是你的电脑配置问题,是你用的dosbox,是dosbox的虚拟处理器主频太低
你可以通过百度去找到修改dosbox ...

是的,哈哈。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-9 03:31

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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