第15章外中断例子中遇到的问题
本帖最后由 项羽姓秦 于 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:,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’;让我纠结百般啊!!
后来也渗入探究,慢慢排查的办法,终于让我发现了问题的存在;(附代码和结果)
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:,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
结果终于与书中所说一致;
不同之处在于那个延缓的时间,就是书中所说的1000万次循环。mov dx,100h
我改为:mov dx,5h
最终正常运行;
但是我还是有一事不明白的,那就是为什么书中所处理的是1000h,而我处理的只需要5h就可以了?
请大神分析一二,感谢!
可惜,16位中断技术现在所有系统都用不了
学来无用 wp231957 发表于 2020-4-8 13:13
可惜,16位中断技术现在所有系统都用不了
学来无用
{:9_230:}{:9_230:}{:9_230:}{:9_230:}
打击好大啊。 项羽姓秦 发表于 2020-4-8 14:32
打击好大啊。
真的,不是假的,你可以学一下基本语法,循环,跳转,各种比较指令,涉及中断的就可以pass了 wp231957 发表于 2020-4-8 14:35
真的,不是假的,你可以学一下基本语法,循环,跳转,各种比较指令,涉及中断的就可以pass了
我不认可这种说法,如果学汇编语言只是为了理解C语言,那确实不需要中断
破解也不需要
但是学操作系统呢?
学操作系统,你说你不理解8086的中断系统?怎么可以?
你想理解一台计算机的运行原理,没有8086中断系统也不行
学单片机也有中断系统,和8086确实有区别,但是原理完全一样
和底层硬件打交道,你就不能不明白8086的中断系统,或者说中断系统
循环的次数和cpu的主频有关,主频越高,执行程序越快,你就需要越多的循环次数
举个例子,对于1Mhz的处理器,你打算延时10秒,循环了10次
但是对于1Ghz的处理器,10次循环只用了1毫秒就完成了,所以你需要更多的次数来让处理器在这里循环,以达到延时
反之也一样,处理器主频低,你就需要少的循环次数 在我这边(虚拟机+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:,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 人造人 发表于 2020-4-8 15:01
我不认可这种说法,如果学汇编语言只是为了理解C语言,那确实不需要中断
破解也不需要
但是学操作系统 ...
也许你是对的,但是写操作系统,对于我这个业余爱好来说,有好些光年那么远
想想华为那么多牛人,也不知道打着中国 logo的操作系统弄没弄出来呢 wp231957 发表于 2020-4-8 20:15
也许你是对的,但是写操作系统,对于我这个业余爱好来说,有好些光年那么远
想想华为那么多牛人,也不知 ...
确实操作系统这门课程也不算难,只是需要好多基础
我现在还写不出操作系统,我还缺少好多基础的东西
人造人 发表于 2020-4-8 20:18
确实操作系统这门课程也不算难,只是需要好多基础
我现在还写不出操作系统,我还缺少好多基础的东西
我是随着兴趣走,c语言都好久没碰了
因为突然发现它没有脚本语言好玩
目前在研究nodejs+mysql构建前后端 wp231957 发表于 2020-4-8 14:35
真的,不是假的,你可以学一下基本语法,循环,跳转,各种比较指令,涉及中断的就可以pass了
好的,感谢你的提议 人造人 发表于 2020-4-8 15:24
循环的次数和cpu的主频有关,主频越高,执行程序越快,你就需要越多的循环次数
举个例子,对于1Mhz的处理 ...
原来是这样,明白了;
原来是我的电脑配置问题!!
{:5_109:}{:5_109:}{:5_109:} wp231957 发表于 2020-4-8 20:15
也许你是对的,但是写操作系统,对于我这个业余爱好来说,有好些光年那么远
想想华为那么多牛人,也不知 ...
其实只是写一个操作系统不难,难的是如何把windows的应用程序移植过去
没有应用软件的操作系统,很难让人们接受
像ubuntu,做的是不错,但是有好多windows应用程序在ubuntu或其他linux中都没有,也找不到替代品
例如CAD软件
这些软件要想在linux用,就只能装虚拟机,本质还是运行在windows下
这些软件在虚拟机中运行很卡,所以我选择把我的学习环境放到虚拟机中,物理主机是windows
所以说,操作系统不难做,难的是应用软件
难的不是去移植某一个应用软件,难的是移植全部的应用软件
wp231957 发表于 2020-4-8 20:25
我是随着兴趣走,c语言都好久没碰了
因为突然发现它没有脚本语言好玩
目前在研究nodejs+mysql构建前后 ...
嗯 wp231957 发表于 2020-4-8 20:25
我是随着兴趣走,c语言都好久没碰了
因为突然发现它没有脚本语言好玩
目前在研究nodejs+mysql构建前后 ...
我现在在玩编译原理
^_^ wp231957 发表于 2020-4-8 20:25
我是随着兴趣走,c语言都好久没碰了
因为突然发现它没有脚本语言好玩
目前在研究nodejs+mysql构建前后 ...
我c语言也很久没碰了,之前都学了c语言,java,JavaScript,HTML和css,现在想接触一下破解。
所以也是从底层学起。 人造人 发表于 2020-4-8 20:30
其实只是写一个操作系统不难,难的是如何把windows的应用程序移植过去
没有应用软件的操作系统,很难让 ...
我也想玩虚拟机呢,可是实力不允许啊,不论单位电脑还是家电脑,都伤不起啊 项羽姓秦 发表于 2020-4-8 20:28
原来是这样,明白了;
原来是我的电脑配置问题!!
不是你的电脑配置问题,是你用的dosbox,是dosbox的虚拟处理器主频太低
你可以通过百度去找到修改dosbox主频的方法,我认为这玩意可以修改,我没试过,^_^
不过好像明白了问题所在以后,也没必要去修改这玩意,毕竟又不是慢到难以接受
wp231957 发表于 2020-4-8 20:34
我也想玩虚拟机呢,可是实力不允许啊,不论单位电脑还是家电脑,都伤不起啊
确实,玩这些东西对电脑的配置要求确实高,我这台电脑已经上了10k了
而且现在也还是不能玩fpga,配置还是不够,后来我一直都没有去试,只是刚买这台的时候试了,quartus速度太慢
按下编译按钮后,接下来的一分钟你等着就行了,什么事也不用做,^_^
我受不了这个速度,所以一直没有回去(回到fpga),fpga我只是入了个门
不知道现在这个软件优化的如何了,反正我现在在学编译原理,还不想回去
人造人 发表于 2020-4-8 20:36
不是你的电脑配置问题,是你用的dosbox,是dosbox的虚拟处理器主频太低
你可以通过百度去找到修改dosbox ...
是的,哈哈。
页:
[1]
2