int 21h的a号功能和int 21h的2号功能有什么区别
时间: 2024-02-23 12:56:15 浏览: 72
int 21h是DOS中断,用于调用DOS的功能。其中a号功能和2号功能都是DOS的子功能之一。
a号功能是读取键盘输入,它可以读取键盘输入缓冲区中的一个字符,如果缓冲区为空,则等待用户输入。
2号功能是在标准输出设备上显示一个字符串,它可以在屏幕上输出一个由DS:DX指向的字符串。
因此,a号功能和2号功能的区别在于它们的功能不同,a号功能用于读取键盘输入,而2号功能用于在屏幕上输出字符串。
相关问题
用INT 21H中的2号功能,在屏幕上显示“0123456789 ”
INT 21H是早期IBM PC DOS系统中用于文本处理的一个中断服务,其中2号功能(功能码为0x02)通常用于打印字符到屏幕。在纯DOS环境下,你可以使用汇编语言编写这样的程序来实现这个任务。这里是一个简单的示例:
```assembly
; 开启视频模式(EGA/VGA)
mov ah, 0x10
int 0x10
; 显示字符串 "0123456789"
mov dx, offset StringToDisplay ; 字符串的内存地址
mov ah, 0x09 ; BIOS打印字符串的功能码
int 0x21 ; 发送INT 21H指令
StringToDisplay db '0123456789', 0 ; 结束符为NULL,表示字符串结束
; 关闭视频模式(如果之前开启过)
mov ah, 0x10
int 0x10
```
在这个例子中,`dx`寄存器指向了存储"0123456789"字节序列的内存位置。`ah, 0x09`组合表示我们要打印文本,`int 0x21`实际发送了INT 21H的命令到BIOS进行屏幕输出。
data segment ;显示提示语句 string_1 db 'input num a: $' string_2 db 0ah,0dh,'input num b: $' string_3 db 0ah,0dh,'a or b= $' data ends code segment assume cs:code,ds:data start: mov ax,data mov ds,ax ;显示提示 lea dx,string_1 mov ah,09h int 21h ;读取第一个数 mov ah,01h ;DOS调用:从键盘输入 int 21h cmp al,39h ;和9相比 ja a1 ;大于9跳转A1 sub al,30h ;AL -30h跳转A jmp a a1: sub al,57h ;AL减去57H a:mov bl,al lea dx,string_2 mov ah,09h int 21h ;读取第二个数 mov ah,01h int 21h cmp al,39h ja b1 sub al,30h jmp b b1: sub al,57h b:mov cl,al lea dx,string_3 mov ah,09h int 21h xor ah,ah ;把AH清零 or cl,bl ;或运算 mov ax,cx ;把结果送给AX AAA ;把十六进制的数换成BCD码 add ah,30h ;输出高位 mov dl,ah mov ah,02h ;调用2号功能显示 int 21h ;输出结果的低位 mov ax,cx aaa add al,30h mov dl,al mov ah,02h int 21h mov ah,4ch int 21h code ends end start各代码意思
这段代码是汇编语言,用于通过DOS调用从键盘输入两个数字,并对它们进行或运算,最后输出结果。下面是各行代码的意思:
- data segment: 定义数据段
- string_1 db 'input num a: $': 定义字符串变量,用于显示提示语句
- string_2 db 0ah,0dh,'input num b: $': 定义字符串变量,用于显示提示语句
- string_3 db 0ah,0dh,'a or b= $': 定义字符串变量,用于显示提示语句
- data ends: 数据段结束
- code segment: 定义代码段
- assume cs:code,ds:data: 定义代码和数据段的段寄存器
- start: 程序开始标签
- mov ax,data: 把数据段的段地址送到AX寄存器中
- mov ds,ax: 把AX寄存器中的地址送到DS寄存器中
- lea dx,string_1: 把字符串变量string_1的地址送到DX寄存器中
- mov ah,09h: 把09h送到AH寄存器中,表示DOS调用功能号为09h,用于显示字符串
- int 21h: 调用DOS中断21h,实现显示字符串的功能
- mov ah,01h: 把01h送到AH寄存器中,表示DOS调用功能号为01h,用于从键盘读取字符
- int 21h: 调用DOS中断21h,实现从键盘读取字符的功能
- cmp al,39h: 把39h和AL寄存器中的值(即读取的字符)进行比较
- ja a1: 如果大于39h,则跳转到标签a1
- sub al,30h: 把AL寄存器中的值减去30h,得到数字的值
- jmp a: 跳转到标签a
- a1: sub al,57h: 把AL寄存器中的值减去57h,得到数字的值
- a: mov bl,al: 把AL寄存器中的值赋给BL寄存器中
- lea dx,string_2: 把字符串变量string_2的地址送到DX寄存器中
- mov ah,09h: 把09h送到AH寄存器中,表示DOS调用功能号为09h,用于显示字符串
- int 21h: 调用DOS中断21h,实现显示字符串的功能
- mov ah,01h: 把01h送到AH寄存器中,表示DOS调用功能号为01h,用于从键盘读取字符
- int 21h: 调用DOS中断21h,实现从键盘读取字符的功能
- cmp al,39h: 把39h和AL寄存器中的值(即读取的字符)进行比较
- ja b1: 如果大于39h,则跳转到标签b1
- sub al,30h: 把AL寄存器中的值减去30h,得到数字的值
- jmp b: 跳转到标签b
- b1: sub al,57h: 把AL寄存器中的值减去57h,得到数字的值
- b: mov cl,al: 把AL寄存器中的值赋给CL寄存器中
- lea dx,string_3: 把字符串变量string_3的地址送到DX寄存器中
- mov ah,09h: 把09h送到AH寄存器中,表示DOS调用功能号为09h,用于显示字符串
- int 21h: 调用DOS中断21h,实现显示字符串的功能
- xor ah,ah: 把AH寄存器中的值清零
- or cl,bl: 把CL寄存器和BL寄存器中的值进行或运算,并把结果送到CL寄存器中
- mov ax,cx: 把CX寄存器中的值送到AX寄存器中
- AAA: 把AX寄存器中的十六进制数转换成BCD码,结果存放在AH和AL寄存器中
- add ah,30h: 把AH寄存器中的值加上30h,得到结果的高位
- mov dl,ah: 把AH寄存器中的值送到DL寄存器中
- mov ah,02h: 把02h送到AH寄存器中,表示DOS调用功能号为02h,用于显示字符
- int 21h: 调用DOS中断21h,实现显示字符的功能
- mov ax,cx: 把CX寄存器中的值送到AX寄存器中
- aaa: 把AX寄存器中的十六进制数转换成BCD码,结果存放在AH和AL寄存器中
- add al,30h: 把AL寄存器中的值加上30h,得到结果的低位
- mov dl,al: 把AL寄存器中的值送到DL寄存器中
- mov ah,02h: 把02h送到AH寄存器中,表示DOS调用功能号为02h,用于显示字符
- int 21h: 调用DOS中断21h,实现显示字符的功能
- mov ah,4ch: 把4ch送到AH寄存器中,表示DOS调用功能号为4ch,用于结束程序
- int 21h: 调用DOS中断21h,实现结束程序的功能
- code ends: 代码段结束
- end start: 程序结束标签
阅读全文