大家好,int 21h 是如何实现的?指令操作端口吗?

时间:2022-10-26 01:00:36
本来想debug 去看源码的,可惜看不下去,有熟悉的没?

还有pc机常见io设备端口是不是符合一定的标准呀?然os能实现一些通用功能,如ide,不用每种定制??

12 个解决方案

#1


是对端口进行操作.
设备的端口肯定得有一套标准,不然机器不识别怎么办.
最后一句没看懂

#2


int 21 是一条机器指令, 你当然看不到他的源代码.
这条指令产生一个中断, 于是 CPU 就切换到中断处理过程. 处理的过程会根据中断号(21 就是中断号)在中断描述符表中去查找一个处理函数来调用.
操作系统初始化过程中都会准备一张中断描述符表, 准备好了之后才能把中断打开. 
DOS 操作系统就利用 21 这个中断号向应用程序提供操作系统的功能.  这样避免了操作系统变化导致函数地址变化后应用程序不能使用的问题.
Windows NT 操作系统早期也采用这种方式, 使用的中断号好像是 0x2e,  直到后来 CPU 专门提供了 sysenter 指令. 在保护模式下应用程序在 Ring 3 级, 根本就不能直接调用操作系统内核(Ring 0 级) 的代码了, 通过中断异常这种方式实现了CPU运行等级的切换.

#3


@www_adintr_com  , 大家好,int 21h 是如何实现的?指令操作端口吗?,当然不是看 int 21h 代码,而是 到 0:84h,在根据 cs:ip  去读代码,可惜汇编  看不下去。。。

#4


汇编指令序列的功能不是被看出来的;而是被单步或设断点运行观察出来的。

#5


@赵4老师  只是调试dos下的,debug  -u


#6


在windows下或dosbox之类的dos,那是V86模式,dos int 21h是透明的,T进去未必是真正的中断程序(或者被直接p过),要看真正的int21h, 找个旧版dos的软盘镜像(最好是dos.7以前),通常是xxx.ima 或xxx.img,用虚拟机载入,再用旧版的debug T 进去

大家好,int 21h 是如何实现的?指令操作端口吗?

#7


@baidu_29183065, 我装的dos 虚拟机,不过就是不愿意看汇编代码
c我都好几年只看,没用了

#8


计算机组成原理→DOS命令→汇编语言→C语言(不包括C++)、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言(包括C++)、架构……

越想走捷径,最后走的弯路越多!

#9


@赵4老师 ,最后一句同意,但前面嘛

首先正则表达式做为有穷状态机 放的位置不大对,而且和编译原理 部分重复;
而且语言从c,从高级,从汇编 开始其实都不是问题,就像学计算机 不会从 可计算理论开始,学网络编程也不会要求懂得tcp状态。。。

#10


引用 9 楼 semisphere 的回复:
@赵4老师 ,最后一句同意,但前面嘛

首先正则表达式做为有穷状态机 放的位置不大对,而且和编译原理 部分重复;
而且语言从c,从高级,从汇编 开始其实都不是问题,就像学计算机 不会从 可计算理论开始,学网络编程也不会要求懂得tcp状态。。。

就连生物进化树里面也有连理枝和环。我觉得。

#11


水生到陆生,陆生到水生,一直反复出现。

#12


引用 11 楼 DelphiGuy 的回复:
水生到陆生,陆生到水生,一直反复出现。

大家好,int 21h 是如何实现的?指令操作端口吗?可遇到知音了!

#1


是对端口进行操作.
设备的端口肯定得有一套标准,不然机器不识别怎么办.
最后一句没看懂

#2


int 21 是一条机器指令, 你当然看不到他的源代码.
这条指令产生一个中断, 于是 CPU 就切换到中断处理过程. 处理的过程会根据中断号(21 就是中断号)在中断描述符表中去查找一个处理函数来调用.
操作系统初始化过程中都会准备一张中断描述符表, 准备好了之后才能把中断打开. 
DOS 操作系统就利用 21 这个中断号向应用程序提供操作系统的功能.  这样避免了操作系统变化导致函数地址变化后应用程序不能使用的问题.
Windows NT 操作系统早期也采用这种方式, 使用的中断号好像是 0x2e,  直到后来 CPU 专门提供了 sysenter 指令. 在保护模式下应用程序在 Ring 3 级, 根本就不能直接调用操作系统内核(Ring 0 级) 的代码了, 通过中断异常这种方式实现了CPU运行等级的切换.

#3


@www_adintr_com  , 大家好,int 21h 是如何实现的?指令操作端口吗?,当然不是看 int 21h 代码,而是 到 0:84h,在根据 cs:ip  去读代码,可惜汇编  看不下去。。。

#4


汇编指令序列的功能不是被看出来的;而是被单步或设断点运行观察出来的。

#5


@赵4老师  只是调试dos下的,debug  -u


#6


在windows下或dosbox之类的dos,那是V86模式,dos int 21h是透明的,T进去未必是真正的中断程序(或者被直接p过),要看真正的int21h, 找个旧版dos的软盘镜像(最好是dos.7以前),通常是xxx.ima 或xxx.img,用虚拟机载入,再用旧版的debug T 进去

大家好,int 21h 是如何实现的?指令操作端口吗?

#7


@baidu_29183065, 我装的dos 虚拟机,不过就是不愿意看汇编代码
c我都好几年只看,没用了

#8


计算机组成原理→DOS命令→汇编语言→C语言(不包括C++)、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言(包括C++)、架构……

越想走捷径,最后走的弯路越多!

#9


@赵4老师 ,最后一句同意,但前面嘛

首先正则表达式做为有穷状态机 放的位置不大对,而且和编译原理 部分重复;
而且语言从c,从高级,从汇编 开始其实都不是问题,就像学计算机 不会从 可计算理论开始,学网络编程也不会要求懂得tcp状态。。。

#10


引用 9 楼 semisphere 的回复:
@赵4老师 ,最后一句同意,但前面嘛

首先正则表达式做为有穷状态机 放的位置不大对,而且和编译原理 部分重复;
而且语言从c,从高级,从汇编 开始其实都不是问题,就像学计算机 不会从 可计算理论开始,学网络编程也不会要求懂得tcp状态。。。

就连生物进化树里面也有连理枝和环。我觉得。

#11


水生到陆生,陆生到水生,一直反复出现。

#12


引用 11 楼 DelphiGuy 的回复:
水生到陆生,陆生到水生,一直反复出现。

大家好,int 21h 是如何实现的?指令操作端口吗?可遇到知音了!