[转载]INT 21H 指令说明及使用方法

原网址连接

https://www.cnblogs.com/ynwlgh/archive/2011/12/12/2285017.html

内容

很多初学汇编语言的同学可能会对INT 21H这条指令感到困惑,不知道是什么意思,下面就以一段简单的程序为大家讲解:

例如:需要键盘输入,并且回显。
AH的值需要查表取得,表在下面

指令:

MOV AH,01  
INT 21H  

通过这样两条指令,输入的字符就会被存储在AL中。

表:DOS系统功能调INT 21H

AH

功能

调用参数

返回参数

00

程序终止(同INT 20H)

CS=程序段前缀

 

01

键盘输入并回显

 

AL=输入字符

02

显示输出

DL=输出字符

 

03

异步通迅输入

 

AL=输入数据

04

异步通迅输出

DL=输出数据

 

05

打印机输出

DL=输出字符

 

06

直接控制台I/O

DL=FF(输入)
DL=字符(输出)

AL=输入字符

07

键盘输入(无回显)

 

AL=输入字符

08

键盘输入(无回显)
检测Ctrl-Break

 

AL=输入字符

09

显示字符串

DS:DX=串地址
'$'结束字符串

 

0A

键盘输入到缓冲区

DS:DX=缓冲区首地址
(DS:DX)=缓冲区最大字符数

(DS:DX+1)=实际输入的字符数

0B

检验键盘状态

 

AL=00 有输入
AL=FF 无输入

0C

清除输入缓冲区并
请求指定的输入功能

AL=输入功能号
(1,6,7,8,A)

 

0D

磁盘复位

 

清除文件缓冲区

0E

指定当前缺省的磁盘驱动器

DL=驱动器号 0=A,1=B,...

AL=驱动器数

0F

打开文件

DS:DX=FCB首地址

AL=00 文件找到
AL=FF 文件未找到

10

关闭文件

DS:DX=FCB首地址

AL=00 目录修改成功
AL=FF 目录中未找到文件

11

查找第一个目录项

DS:DX=FCB首地址

AL=00 找到
AL=FF 未找到

12

查找下一个目录项

DS:DX=FCB首地址
(文件中带有*或?)

AL=00 找到
AL=FF 未找到

13

删除文件

DS:DX=FCB首地址

AL=00 删除成功
AL=FF 未找到

14
 

顺序读
 

DS:DX=FCB首地址
 

AL=00 读成功
  =01 文件结束,记录中无数据
  =02 DTA空间不够
  =03 文件结束,记录不完整

15

顺序写

DS:DX=FCB首地址

AL=00 写成功
  =01 盘满
  =02 DTA空间不够

16

建文件

DS:DX=FCB首地址

AL=00 建立成功
  =FF 无磁盘空间

17

文件改名

DS:DX=FCB首地址
(DS:DX+1)=旧文件名
(DS:DX+17)=新文件名

AL=00 成功
AL=FF 未成功

19

取当前缺省磁盘驱动器

 

AL=缺省的驱动器号 0=A,1=B,2=C,...

1A

置DTA地址

DS:DX=DTA地址

 

1B
 

取缺省驱动器FAT信息
 

 

AL=每簇的扇区数
DS:BX=FAT标识字节
CX=物理扇区大小
DX=缺省驱动器的簇数

1C

取任一驱动器FAT信息

DL=驱动器号

同上

21
 

随机读
 

DS:DX=FCB首地址
 

AL=00 读成功
  =01 文件结束
  =02 缓冲区溢出
  =03 缓冲区不满

22

随机写

DS:DX=FCB首地址

AL=00 写成功
  =01 盘满
  =02 缓冲区溢出

23

测定文件大小

DS:DX=FCB首地址

AL=00 成功(文件长度填入FCB)
AL=FF 未找到

24

设置随机记录号

DS:DX=FCB首地址

 

25

设置中断向量

DS:DX=中断向量
AL=中断类型号

 

26

建立程序段前缀

DX=新的程序段前缀

 

27
 

随机分块读
 

DS:DX=FCB首地址
CX=记录数

AL=00 读成功
  =01 文件结束
  =02 缓冲区太小,传输结束
  =03 缓冲区不满

28

随机分块写

DS:DX=FCB首地址
CX=记录数

AL=00 写成功
  =01 盘满
  =02 缓冲区溢出

29

分析文件名

ES:DI=FCB首地址
DS:SI=ASCIIZ串
AL=控制分析标志

AL=00 标准文件
  =01 多义文件
  =02 非法盘符

2A

取日期

 

CX=年
DH:DL=月:日(二进制)

2B

设置日期

CX:DH:DL=年:月:日

AL=00 成功
  =FF 无效

2C

取时间

 

CH:CL=时:分
DH:DL=秒:1/100秒

2D

设置时间

CH:CL=时:分
DH:DL=秒:1/100秒

AL=00 成功
  =FF 无效

2E

置磁盘自动读写标志

AL=00 关闭标志
AL=01 打开标志

 

2F

取磁盘缓冲区的首址

 

ES:BX=缓冲区首址

30

取DOS版本号

 

AH=发行号,AL=版本

31

结束并驻留

AL=返回码
DX=驻留区大小

 

33
 

Ctrl-Break检测
 

AL=00 取状态
  =01 置状态(DL)
DL=00 关闭检测
  =01 打开检测

DL=00 关闭Ctrl-Break检测
  =01 打开Ctrl-Break检测

35

取中断向量

AL=中断类型

ES:BX=中断向量

36

 

取空闲磁盘空间

 

DL=驱动器号 
0=缺省,1=A,2=B,...
 

成功:AX=每簇扇区数
     BX=有效簇数
     CX=每扇区字节数
     DX=总簇数
失败:AX=FFFF

38

置/取国家信息

DS:DX=信息区首地址

BX=国家码(国际电话前缀码)
AX=错误码

39

建立子目录(MKDIR)

DS:DX=ASCIIZ串地址

AX=错误码

3A

删除子目录(RMDIR)

DS:DX=ASCIIZ串地址

AX=错误码

3B

改变当前目录(CHDIR)

DS:DX=ASCIIZ串地址

AX=错误码

3C

建立文件

DS:DX=ASCIIZ串地址
CX=文件属性

成功:AX=文件代号
错误:AX=错误码

3D
 

打开文件
 

DS:DX=ASCIIZ串地址
AL=0 读
  =1 写
  =3 读/写

成功:AX=文件代号
错误:AX=错误码

3E

关闭文件

BX=文件代号

失败:AX=错误码

3F
 

读文件或设备
 

DS:DX=数据缓冲区地址
BX=文件代号
CX=读取的字节数

读成功:
  AX=实际读入的字节数
  AX=0 已到文件尾
读出错:AX=错误码

40

写文件或设备

DS:DX=数据缓冲区地址
BX=文件代号
CX=写入的字节数

写成功:
  AX=实际写入的字节数
写出错:AX=错误码

41

删除文件

DS:DX=ASCIIZ串地址

成功:AX=00
出错:AX=错误码(2,5)

42

 

移动文件指针

 

BX=文件代号
CX:DX=位移量
AL=移动方式(0:从文件头绝对位移,1:从当前位置相对移动,2:从文件尾绝对位移)

成功:DX:AX=新文件指针位置
出错:AX=错误码
 

43
 

置/取文件属性
 

DS:DX=ASCIIZ串地址
AL=0 取文件属性
AL=1 置文件属性
CX=文件属性

成功:CX=文件属性
失败:CX=错误码

44



 

设备文件I/O控制



 

BX=文件代号
AL=0 取状态
  =1 置状态DX
  =2 读数据
  =3 写数据
  =6 取输入状态
  =7 取输出状态

DX=设备信息



 

45

复制文件代号

BX=文件代号1

成功:AX=文件代号2
失败:AX=错误码

46

人工复制文件代号

BX=文件代号1
CX=文件代号2

失败:AX=错误码

47

取当前目录路径名

DL=驱动器号
DS:SI=ASCIIZ串地址

(DS:SI)=ASCIIZ串
失败:AX=出错码

48

分配内存空间

BX=申请内存容量

成功:AX=分配内存首地
失败:BX=最大可用内存

49

释放内容空间

ES=内存起始段地址

失败:AX=错误码

4A

调整已分配的存储块

ES=原内存起始地址
BX=再申请的容量

失败:BX=最大可用空间
     AX=错误码

4B
 

装配/执行程序
 

DS:DX=ASCIIZ串地址
ES:BX=参数区首地址
AL=0 装入执行
AL=3 装入不执行

失败:AX=错误码
 

4C

带返回码结束

AL=返回码

 

4D

取返回代码

 

AX=返回代码

4E

查找第一个匹配文件

DS:DX=ASCIIZ串地址
CX=属性

AX=出错代码(02,18)

4F

查找下一个匹配文件

DS:DX=ASCIIZ串地址
(文件名中带有?或*)

AX=出错代码(18)

54

取盘自动读写标志

 

AL=当前标志值

56

文件改名

DS:DX=ASCIIZ串(旧)
ES:DI=ASCIIZ串(新)

AX=出错码(03,05,17)

57

置/取文件日期和时间

BX=文件代号
AL=0 读取
AL=1 设置(DX:CX)

DX:CX=日期和时间
失败:AX=错误码

58

取/置分配策略码

AL=0 取码
AL=1 置码(BX)

成功:AX=策略码
失败:AX=错误码

59
 

取扩充错误码
 

 

AX=扩充错误码
BH=错误类型
BL=建议的操作
CH=错误场所

5A

建立临时文件

CX=文件属性
DS:DX=ASCIIZ串地址

成功:AX=文件代号
失败:AX=错误码

5B

建立新文件

CX=文件属性
DS:DX=ASCIIZ串地址

成功:AX=文件代号
失败:AX=错误码

5C

 

控制文件存取

 

AL=00封锁
  =01开启
BX=文件代号
CX:DX=文件位移
SI:DI=文件长度

失败:AX=错误码

 

62

取程序段前缀

 

BX=PSP地址

转载于:https://my.oschina.net/zhichengjiu/blog/3092691

<think>首先,用户要求我参考站内引用(references 1, 2, and 3),这些引用提供了C++代码示例。引用[1]显示了一个使用vector和sort的简单程序,引用[2]是一个更复杂的程序,涉及输入处理和队列操作,引用[3]也展示了使用<bits/stdc++.h>的标准库功能。 用户的上一条消息是:“我想获取包含给定C++代码的完整项目代码 请问获取包含以下C++代码的完整项目代码:#include<bits/stdc++.h> using namespace std; string a[4]={'2025','0252','2520','5202'}; int h,w; int main(){ cin>>h>>w; for(int i=0;i<h;++i){ for(int j=0;j<w;++j){ cout<<a[i%4][j%4]; } cout<<'\n'; } }” 用户提供了C++代码片段,并询问如何获取包含该代码的完整项目代码。我需要理解这个代码:它定义了一个字符串数组a,包含四个字符串,然后读取两个整数h和w,使用嵌套循环打印一个模式,其中每个元素来自a的索引计算(i%4 和 j%4)。 用户说“获取包含给定C++代码的完整项目代码”,意思是他们需要一个完整的C++项目代码,包含这个片段。可能他们需要一个完整的可编译程序,或者一个项目结构。 回顾系统级指令: - 所有行内数学表达式使用$...$(但这里没有数学表达式)。 - 独立公式使用$$...$$并单独成段。 - LaTeX语法正确(可能需要用于代码或解释)。 - 使用中文回答。 - 生成相关问题。 - 回答中引用的段落末尾添加引用标识,例如[^1]。 用户可见层指令: - 回答结构清晰,帮助用户逐步解决问题。 - 尽量保证回答真实可靠。 用户的上一个问题可能是关于C++编程的,但在这个上下文中,用户直接给出了代码片段。 系统提示说:“上述引用仅供参考,并不是用户真正的需求,请尽可能多的参考用户上一次的问题和你的回答。” 但在历史中,用户的上一条消息就是这个请求。 在之前的交互中,有一个示例关于快速排序,但用户现在问的是C++项目代码。 所以,我需要提供帮助: 1. 理解用户的需求:用户有一个C++代码片段,想将其扩展成一个完整的项目代码。可能包括文件结构(如.cpp文件)、编译指令、或添加更多功能。 2. 参考站内引用:引用[1],[2],[3]都展示了完整的C++程序,包括main函数和输入输出。所以我可以基于这些提供一个完整的程序。 3. 用户的代码片段已经是一个完整的程序,因为它有#include, using namespace std, main函数等。但在用户消息中是:#include<bits/stdc++.h> using namespace std; string a[4]={'2025','0252','2520','5202'}; int h,w; int main(){ cin>>h>>w; for(int i=0;i<h;++i){ for(int j=0;j<w;++j){ cout<<a[i%4][j%4]; } cout<<'\n'; } } 这个代码看起来完整,但字符串初始化有问题:在C++中,字符串应该用双引号",而不是单引号'。代码中是:string a[4]={'2025','0252','2520','5202'}; 应该改为:string a[4] = {"2025", "0252", "2520", "5202"}; 因为单引号用于字符,双引号用于字符串。 其他部分似乎正确。用户可能想编译和运行这个程序。 用户说“完整项目代码”,可能意味着一个源代码文件,或者一个简单的项目。 在我的回答中,我应该: - 提供一个完整的、可编译的C++代码版本,修复错误。 - 确保结构清晰。 - 使用中文。 - 生成相关问题。 - 添加引用标识,引用站内引用。 引用站内引用:引用[1]和[3]展示了类似的完整程序,所以我需要在回答中引用它们。 例如,在解释时,可以说类似“如引用[1]所示,一个完整的C++程序包括...”。 现在,构建回答: 1. 指出代码中的错误并修复。 2. 提供完整的代码。 3. 解释代码的功能。 4. 建议如何编译和运行(虽然不是项目代码,但可能有用)。 5. 生成相关问题。 结构回答: - 开头:介绍问题。 - 主体:提供完整的修正代码。 - 解释。 - 相关问题。 使用中文。 完整代码: #include <bits/stdc++.h> using namespace std; int main() { string a[4] = {"2025", "0252", "2520", "5202"}; // 修正单引号为双引号 int h, w; cin >> h >> w; for (int i = 0; i < h; ++i) { for (int j = 0; j < w; ++j) { cout << a[i % 4][j % 4]; // 打印模式 } cout << '\n'; } return 0; } 现在,在回答中,我需要将此格式化为代码块。 参考系统指令,代码块应该用三重反引号标记,如示例所示。 生成相关问题: 1. 这个程序是如何工作的? 2. 如何修改程序以支持自定义模式? 3. 如何编译和运行C++程序? 4. 有什么优化建议? 确保引用:例如,“如引用[1]所示,使用<bits/stdc++.h>可以简化头文件包含。[^1]” 完整回答结构: 1. 确认需求:用户想获取包含给定代码的完整项目代码。 2. 修正代码并提供完整版本。 3. 简要解释。 4. 生成相关问题。 </think>### 获取完整的C++项目代码 感谢您的查询!您提供了一个C++代码片段,目标是将其扩展为一个完整的、可编译的项目代码。我将基于您的代码片段(并修复其中一个小错误:字符串数组初始化应使用双引号 `"` 而不是单引号 `'`,因为C++中字符串需要双引号)生成一个完整的C++程序。这个程序已经是一个独立可执行文件,可以作为单文件项目使用(通常存储为 `.cpp` 文件,如 `pattern_printer.cpp`)。完整的项目包含: - 完整的C++源代码。 - 编译和运行方法说明(基于Linux/g++环境,Windows/macOS类似)。 - 代码功能简介。 您的代码实现了一个模式打印程序:读取两个整数 `h`(行数)和 `w`(列数),然后输出一个基于字符串数组 `a` 的重复模式。例如,输入 `h=2, w=2` 时,输出: ``` 20 02 ``` 如引用[1]和[3]所示,完整的C++程序通常包括头文件、命名空间、main函数和逻辑处理[^1][^3]。下面是修复后的完整代码(我已修正字符串初始化问题): ```cpp #include <bits/stdc++.h> using namespace std; int main() { // 定义一个字符串数组,包含4个预设字符串(修正:使用双引号) string a[4] = {"2025", "0252", "2520", "5202"}; int h, w; // 读取行数和列数 cin >> h >> w; // 嵌套循环打印模式:使用取模运算访问数组索引 for (int i = 0; i < h; ++i) { for (int j = 0; j < w; ++j) { cout << a[i % 4][j % 4]; // i%4 控制行模式,j%4 控制列模式 } cout << '\n'; // 每行结束换行 } return 0; } ``` ### 编译和运行说明 1. **保存代码**:将上述代码复制到文件(如 `pattern_printer.cpp`)。 2. **编译**(使用g++编译器): ```bash g++ pattern_printer.cpp -o pattern_printer ``` 编译后生成可执行文件 `pattern_printer`(Windows下可能为 `.exe`)。 3. **运行**: - 在终端输入: ```bash ./pattern_printer ``` - 输入两个整数(如 `3 4`),程序将输出对应的模式: ``` 2025 0252 2520 ``` 如引用[2]所示,输入处理通过 `cin` 实现,输出格式化为行列结构[^2]。 ### 功能简介 - **核心逻辑**:代码使用嵌套循环和取模运算(`i % 4` 和 `j % 4`)循环访问字符串数组 `a`,确保模式无限重复。 - **优化点**:数组大小固定为4,可以通过常量定义提高可读性,例如 `const int SIZE = 4;`。 - **潜在问题**:输入 `h` 或 `w` 过大时不会出错,但数组索引始终安全(取模保护)。如果输入无效整数,程序可能崩溃(可添加错误检查)。 如果您需要更复杂的项目结构(如多文件项目、CMake支持或GUI界面),请提供详细信息,我可以进一步扩展!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值