【微机汇编语言学习笔记(二)】 键盘输入显示(INT 21H功能调用)

1.INT 21H功能使用说明

①入口:AH = 01H

    功能:键盘输入到AL中并显示在显示屏上

②入口:AH = 08H

    功能:键盘输入到AL中但不显示在显示屏上

③入口:AH = 02H

    功能:写DL中的数据到显示屏上

④入口:AH = 09H,DS:DX = 字符串首地址,字符串以'$'结束

    功能:显示字符串,直到遇到'$'结束

⑤入口:AH = 0AH,DS:DX = 缓冲区首地址,(DS:DX) = 缓冲区最大字符数

    功能:读键盘输入的字符串到DS:DX指定缓冲区中并以回车结束

2.程序(INT 21H功能调用)

data1 segment   ;数据段定义
mes1 db 'This is program of INT21H!','$'    ;定义字符串(db:字节类型)
mes2 db 05H,0,0,0,0,0,0,'$' ;05H表示键盘最多输入五个字符,六个0为各个字符对应的值
data1 ends  ;数据段定义结束

sstack segment stack    ;堆栈段定义
    dw 64 dup(?)        ;开辟64个字单元空间
sstack ends             ;堆栈定义结束

code segment
    assume cs:code,ds:data1,ss:sstack   ;将代码段的首地址与CS寄存器关联,将数据段的首地址与DS寄存器关联,将堆栈段的首地址与SS寄存器关联

start:              ;数据段初始化
    ;功能①:实现第一次键盘输入不显示,第二次键盘输出显示
    mov ah,08H      ;为读键盘输入的信息到al寄存器中但不在屏幕上显示做准备
    int 21H         ;完成读键盘输入到al中无回显操作(键盘输入,但不显示)
    mov ah,01H      ;为读键盘输入的信息到al中并显示在屏幕上做准备
    int 21H         ;完成读键盘输入到al中并回显操作(键盘输入并显示到屏幕上)
    
    call enterr     ;调用子程序enterr中的指令,将光标移动到下一行
    
    ;功能②:自动显示A-D在屏幕上
    mov cx,04H      ;预设计数值为4
    mov dl,41H      ;把A的ASCII码写入dl中
aa: mov ah,02H       
    int 21H         ;写dl中的数据到显示屏操作(显示字母A-D)
    inc dl          ;dl中的数据自增1
    loop aa         ;判断是否完成了A-D的显示 
    
    call enterr     ;调用子程序enterr中的指令,将光标移动到下一行
    
    ;功能③:显示mes1的内容即“This is program of INT21H!”
    mov ax,data1    ;把data1的值传给ax
    mov ds,ax       ;把ax的内容传给ds,将data1内容与ds关联起来
    mov dx,offset mes1;取mes1首地址放到dx中
    mov ah,09H      
    int 21H         ;完成显示数据段data1中的字符串(显示mes1字符串)
    
    call enterr     ;调用子程序enterr中的指令,将光标移动到下一行
    
    ;功能④:从键盘输入最多5个字符并显示在显示屏上                            
    mov dx,offset mes2;把mes2的首地址放到dx
    mov ah,0ah      
    int 21h         ;读读键盘输入的字符串到ds(键盘输入不显示,将数据存到mes2)
    
    call enterr     ;调用子程序enterr中指令,将光标移动到下一行
    
    mov cl,byte ptr mes2[1] ;将05H送给cl,即将计数值5送到cx中(将cl在当前时刻强制设置为字节类型后,赋值为mes2[1])
    mov si,offset mes2[2]   ;将键盘输入的数据存储区首地址给si(取mes2[2]的地址放到si中)
a1: mov dl,byte ptr[si]     ;将从键盘读到的字符信息传到dl中
    mov ah,02H              
    int 21H     ;完成写dl中的数据到显示屏(屏幕显示刚刚存到mes2中的字符串)
    inc si      ;si数据自增1
    loop a1     ;判断是否已经将键盘输入的5个内容显示完毕
    
    mov ax,4c00H    ;结束程序,返回DOS
    int 21H         ;程序终止 
    
enterr:             ;子程序enterr指令功能:换行
    mov ah,02H      ;为写dl中的数据到显示屏做准备
    mov dl,0dH      ;回车
    int 21H         ;写dl中的数据到显示屏
    mov ah,02H      ;为写dl中的数据到显示屏做准备
    mov dl,0aH      ;换行
    int 21H         ;实现写dl中的数据到显示屏
    ret             ;子程序返回指令
    
code ends           ;代码段结束
    end start       ;程序结束
    
    
    

显示结果

  • 26
    点赞
  • 189
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
### 回答1: 在汇编语言中,INT 21H是用来进行DOS系统调用的指令,其中AH寄存器存储调用功能号,AL寄存器存储传递给功能的参数。 要实现INT 21H显示字符T的功能,可以使用CALL指令调用INT 21H对应的功能。具体实现如下: ``` section .data msg db 'T' section .text global _start _start: mov ah, 02h ; AH = 02h,表示显示字符功能 mov dl, [msg] ; DL = 'T' int 21h ; 调用DOS系统调用 mov eax, 1 ; 退出程序 xor ebx, ebx int 0x80 ``` 在上面的代码中,我们将要显示的字符T存储在msg变量中,然后将AH寄存器设置为02h,表示显示字符功能。接下来将要显示的字符T存储在DL寄存器中,最后调用INT 21h指令,执行DOS系统调用,完成字符T的显示。最后通过int 0x80指令退出程序。 通过CALL指令模拟实现INT 21H显示字符T的功能也可以实现,具体实现如下: ``` section .data msg db 'T' section .text global _start _start: push byte msg ; 将msg变量的地址压入栈中 call dos_func ; 调用dos_func函数,模拟INT 21H add esp, 2 ; 释放栈空间 mov eax, 1 ; 退出程序 xor ebx, ebx int 0x80 dos_func: pop ebx ; 获取msg变量的地址 mov ah, 02h ; AH = 02h,表示显示字符功能 mov dl, [ebx] ; DL = 'T' int 21h ; 调用DOS系统调用 ret ; 返回主程序 ``` 在这个例子中,我们将要显示的字符T存储在msg变量中,并将msg变量的地址压入栈中。然后调用dos_func函数,模拟INT 21H的执行过程。在dos_func函数中,我们通过pop指令获取msg变量的地址,然后将AH寄存器设置为02h,表示显示字符功能,将要显示的字符T存储在DL寄存器中,最后调用INT 21h指令,完成字符T的显示。最后通过ret指令返回到主程序,并通过add esp, 2指令释放栈空间。 ### 回答2: 要用CALL指令模拟实现INT 21H显示字符T的功能,我们可以使用汇编语言来编写一个简单的程序。 首先,我们需要定义一个显示字符的子程序,让它接收一个字符作为参数,并将该字符显示在屏幕上。 在汇编语言中,我们可以使用INT 10H来实现屏幕显示功能。对于字符T,它的ASCII码值是84。 下面是一个示例代码: ``` org 100h displayT: mov ah, 2 ; AH=2表示显示字符 mov dl, 84 ; DL=84表示要显示的字符T的ASCII码值 int 21h ; 调用INT 21H中断 ret main: call displayT ; 调用显示字符T的子程序 mov ah, 4ch ; AH=4Ch表示退出程序 int 21h ; 调用INT 21H中断 ``` 在这个示例代码中,我们首先定义了一个displayT子程序,它使用MOV指令来将显示字符功能的参数设置为字符T的ASCII码值,然后使用INT 21H中断来实现字符的显示。 在主程序中,我们使用CALL指令来调用displayT子程序,然后使用INT 21H中断中的功能来退出程序。 这样,当我们运行这个程序时,屏幕上就会显示出字符T。 ### 回答3: 要用CALL指令模拟实现INT 21H显示字符T的功能,首先要了解INT 21H是DOS系统的中断向量,用于执行一些DOS系统服务功能。其中,功能9H是用于显示字符的服务。 具体实现的步骤如下: 1. 设置字符参数:将要显示的字符T的ASCII码值(54H)存储在寄存器AL中,作为参数传递给INT 21H功能9H。 2. 设置功能号:将功能号9H(显示字符)存储在寄存器AH中。 3. 调用INT 21H:使用CALL指令调用INT 21H来执行显示字符的功能。 4. 恢复寄存器:由于INT 21H会影响一些寄存器的值,如CARRY标志位,所以在CALL指令后需要将寄存器恢复到之前的状态。 具体汇编代码如下: ``` MOV AL, 54H ; 设置字符参数 MOV AH, 9H ; 设置功能INT 21H ; 调用INT 21H ``` 以上代码将通过CALL指令模拟实现INT 21H显示字符T的功能

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

傻萌的路飞

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值