int 21h的a号功能和int 21h的1号功能有什么区别
时间: 2024-02-23 16:56:14 浏览: 162
int 21h是DOS中断,用于调用DOS的功能。其中a号功能和1号功能都是DOS的子功能之一。
a号功能是读取键盘输入,它可以读取键盘输入缓冲区中的一个字符,如果缓冲区为空,则等待用户输入。
1号功能是在标准输出设备上显示一个字符,它可以在屏幕上输出一个字符。
因此,a号功能和1号功能的区别在于它们的功能不同,a号功能用于读取键盘输入,而1号功能用于在屏幕上输出字符。
相关问题
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: 程序结束标签
用 INT 21H 的 A 号功能,输入一个字符串“Hello, world!”,存放在内存,然后倒序输出
好的,我明白了你的问题。下面是汇编代码实现:
```
section .data
msg db 'Hello, world!',0
len equ $-msg
section .text
global _start
_start:
; 输入字符串
mov ah, 0Ah
mov dx, msg
int 21h
; 逆序输出字符串
mov si, msg
add si, len ; 指向字符串末尾
dec si ; 指向最后一个字符
mov ah, 02h
mov dl, 0Ah ; 换行符
lp:
mov dl, [si] ; 取出当前字符
int 21h ; 输出当前字符
dec si ; 指向前一个字符
cmp si, offset msg-1 ; 判断是否到字符串头
jne lp ; 循环输出
; 退出程序
mov ah, 4Ch
mov al, 0
int 21h
```
这段代码使用 INT 21H 的 0Ah 功能输入一个字符串,然后使用 02H 功能逆序输出字符串。具体实现过程见注释。
阅读全文