项羽姓秦 发表于 2020-4-8 11:32:04

第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就可以了?
请大神分析一二,感谢!

wp231957 发表于 2020-4-8 13:13:38

可惜,16位中断技术现在所有系统都用不了
学来无用

项羽姓秦 发表于 2020-4-8 14:32:31

wp231957 发表于 2020-4-8 13:13
可惜,16位中断技术现在所有系统都用不了
学来无用

{:9_230:}{:9_230:}{:9_230:}{:9_230:}

打击好大啊。

wp231957 发表于 2020-4-8 14:35:15

项羽姓秦 发表于 2020-4-8 14:32
打击好大啊。

真的,不是假的,你可以学一下基本语法,循环,跳转,各种比较指令,涉及中断的就可以pass了

人造人 发表于 2020-4-8 15:01:36

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

我不认可这种说法,如果学汇编语言只是为了理解C语言,那确实不需要中断
破解也不需要
但是学操作系统呢?
学操作系统,你说你不理解8086的中断系统?怎么可以?
你想理解一台计算机的运行原理,没有8086中断系统也不行
学单片机也有中断系统,和8086确实有区别,但是原理完全一样
和底层硬件打交道,你就不能不明白8086的中断系统,或者说中断系统

人造人 发表于 2020-4-8 15:24:57

循环的次数和cpu的主频有关,主频越高,执行程序越快,你就需要越多的循环次数
举个例子,对于1Mhz的处理器,你打算延时10秒,循环了10次
但是对于1Ghz的处理器,10次循环只用了1毫秒就完成了,所以你需要更多的次数来让处理器在这里循环,以达到延时

反之也一样,处理器主频低,你就需要少的循环次数

人造人 发表于 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:,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

wp231957 发表于 2020-4-8 20:15:58

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

也许你是对的,但是写操作系统,对于我这个业余爱好来说,有好些光年那么远
想想华为那么多牛人,也不知道打着中国 logo的操作系统弄没弄出来呢

人造人 发表于 2020-4-8 20:18:46

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

确实操作系统这门课程也不算难,只是需要好多基础
我现在还写不出操作系统,我还缺少好多基础的东西

wp231957 发表于 2020-4-8 20:25:44

人造人 发表于 2020-4-8 20:18
确实操作系统这门课程也不算难,只是需要好多基础
我现在还写不出操作系统,我还缺少好多基础的东西

我是随着兴趣走,c语言都好久没碰了
因为突然发现它没有脚本语言好玩
目前在研究nodejs+mysql构建前后端

项羽姓秦 发表于 2020-4-8 20:26:23

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

好的,感谢你的提议

项羽姓秦 发表于 2020-4-8 20:28:52

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

原来是这样,明白了;
原来是我的电脑配置问题!!
{:5_109:}{:5_109:}{:5_109:}

人造人 发表于 2020-4-8 20:30:26

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

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

所以说,操作系统不难做,难的是应用软件
难的不是去移植某一个应用软件,难的是移植全部的应用软件

人造人 发表于 2020-4-8 20:31:06

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

人造人 发表于 2020-4-8 20:31:45

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

我现在在玩编译原理
^_^

项羽姓秦 发表于 2020-4-8 20:32:26

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

我c语言也很久没碰了,之前都学了c语言,java,JavaScript,HTML和css,现在想接触一下破解。
所以也是从底层学起。

wp231957 发表于 2020-4-8 20:34:22

人造人 发表于 2020-4-8 20:30
其实只是写一个操作系统不难,难的是如何把windows的应用程序移植过去
没有应用软件的操作系统,很难让 ...

我也想玩虚拟机呢,可是实力不允许啊,不论单位电脑还是家电脑,都伤不起啊

人造人 发表于 2020-4-8 20:36:23

项羽姓秦 发表于 2020-4-8 20:28
原来是这样,明白了;
原来是我的电脑配置问题!!

不是你的电脑配置问题,是你用的dosbox,是dosbox的虚拟处理器主频太低
你可以通过百度去找到修改dosbox主频的方法,我认为这玩意可以修改,我没试过,^_^
不过好像明白了问题所在以后,也没必要去修改这玩意,毕竟又不是慢到难以接受

人造人 发表于 2020-4-8 20:43:10

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

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

项羽姓秦 发表于 2020-4-8 22:58:36

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

是的,哈哈。
页: [1] 2
查看完整版本: 第15章外中断例子中遇到的问题