鱼C论坛

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

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

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

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

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

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

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

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

然而我根据书中的代码进行编译,却发现结果与书中有所不同;(附代码和结果)
assume cs:code
stack segment
        db 128 dup (0)
stack ends
code segment
start:
        mov ax,stack
        mov ss,ax
        mov sp,128
        
        mov ax,0b800h
        mov es,ax
        mov ah,'a'
s:        mov es:[160*12+40*2],ah
        call delay
        inc ah
        cmp ah,'z'
        jna s
        mov ax,4c00h
        int 21h

delay: 
        push ax
        push dx
        mov dx,1000h
        mov ax,0
s1: sub ax,1
        sbb dx,0
        cmp ax,0
        jne s1
        cmp dx,0
        jne s1
        pop dx
        pop ax
        ret
        
code ends
end start
        

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

微信截图_20200408102102.png

后来也渗入探究,慢慢排查的办法,终于让我发现了问题的存在;(附代码和结果)
assume cs:code
stack segment
        db 128 dup (0)
stack ends
code segment
start:
        mov ax,stack
        mov ss,ax
        mov sp,128
        
        mov ax,0b800h
        mov es,ax
        mov ah,'a'
s:        mov es:[160*12+40*2],ah
        call delay
        inc ah
        cmp ah,'z'
        jna s
        mov ax,4c00h
        int 21h

delay: 
        push ax
        push dx
        mov dx,5h
        mov ax,0
s1: sub ax,1
        sbb dx,0
        cmp ax,0
        jne s1
        cmp dx,0
        jne s1
        pop dx
        pop ax
        ret
        
code ends
end start
        

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

QQ截图20200408102028.png

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

我改为:mov dx,5h

最终正常运行;

但是我还是有一事不明白的,那就是为什么书中所处理的是1000h,而我处理的只需要5h就可以了?
请大神分析一二,感谢!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-4-8 13:13:38 From FishC Mobile | 显示全部楼层
可惜,16位中断技术现在所有系统都用不了
学来无用
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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



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

使用道具 举报

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

真的,不是假的,你可以学一下基本语法,循环,跳转,各种比较指令,涉及中断的就可以pass了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

使用道具 举报

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

反之也一样,处理器主频低,你就需要少的循环次数
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-8 15:33:49 | 显示全部楼层
在我这边(虚拟机+xp)
1000h的循环次数都有点太少,都有点看不清显示的字母,在我这边2000h感觉差不多
assume cs:code
stack segment
        db 128 dup (0)
stack ends
code segment
start:
        mov ax,stack
        mov ss,ax
        mov sp,128
        
        mov ax,0b800h
        mov es,ax
        mov ah,'a'
s:      mov es:[160*12+40*2],ah
        call delay
        inc ah
        cmp ah,'z'
        jna s
        mov ax,4c00h
        int 21h

delay: 
        push ax
        push dx
        mov dx,2000h
        mov ax,0
s1:     sub ax,1
        sbb dx,0
        cmp ax,0
        jne s1
        cmp dx,0
        jne s1
        pop dx
        pop ax
        ret
        
code ends
end start
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

使用道具 举报

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

确实操作系统这门课程也不算难,只是需要好多基础
我现在还写不出操作系统,我还缺少好多基础的东西
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

我是随着兴趣走,c语言都好久没碰了
因为突然发现它没有脚本语言好玩
目前在研究nodejs+mysql构建前后端
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

好的,感谢你的提议
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

原来是这样,明白了;
原来是我的电脑配置问题!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

所以说,操作系统不难做,难的是应用软件
难的不是去移植某一个应用软件,难的是移植全部的应用软件
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

使用道具 举报

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

我现在在玩编译原理
^_^
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

我c语言也很久没碰了,之前都学了c语言,java,JavaScript,HTML和css,现在想接触一下破解。
所以也是从底层学起。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

我也想玩虚拟机呢,可是实力不允许啊,不论单位电脑还是家电脑,都伤不起啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

使用道具 举报

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

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

使用道具 举报

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

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-29 03:02

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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