汇编语言——键盘输入字符

程序目的:从键盘上键入字符,并将该字符加1再输出


程序代码:

  1. D_SEG SEGMENT  
  2.     CHAR1 DB 1 DUP(0)   ;定义字符  
  3. D_SEG ENDS  
  4.   
  5. C_SEG SEGMENT  
  6.       
  7.     ASSUME CS:C_SEG , DS:D_SEG  ;定义CS,DS,入口  
  8.       
  9.     START : MOV AX ,0B800H  
  10.             MOV ES ,AX          ;将显存地址0B800H赋值给ES  
  11.             MOV AX ,D_SEG       ;获取D_SEG的地址  
  12.             MOV DS ,AX          ;将D_SEG的地址赋值给DS  
  13.             LEA SI ,CHAR1       ;将CHAR1的地址赋值给SI  
  14.               
  15.             MOV AH ,1           ;01号功能为输入一个字符并且显示  
  16.             INT 21H  
  17.             MOV [DI],AL         ;输入的字符存放在AL寄存器中,现(DS:[DI])=(AL)  
  18.               
  19.             MOV AL,[DI]         ;(AL)=(DS:[DI])  
  20.             ADD AL,1            ;(AL)=(AL)+1  
  21.             MOV AH,0CH          ;设置字体格式  
  22.               
  23.             INC SI  
  24.             INC SI  
  25.             INC SI  
  26.             INC SI              ;指向显存的下4个单元  
  27.             MOV ES:[SI],AX      ;在显存中输出  
  28.               
  29.             MOV AX,4C00H  
  30.             INT 21H  
  31. C_SEG ENDS  
  32. END START  
  33.               

运行结果:


汇编语言中,字符输入通常需要使用系统调用来实现。不同的操作系统提供的系统调用可能不同,下面以Linux操作系统为例,介绍一种实现字符输入的方法。 在Linux系统中,字符输入通常使用系统调用read实现。read系统调用的参数包括文件描述符,读取的缓冲区地址和大小。对于标准输入设备(例如键盘),文件描述符为0。因此,我们可以通过以下汇编代码实现从键盘读取字符串: ``` section .data buffer db 100 ; 缓冲区大小为100字节 section .bss len resb 1 ; 存储读取的字符串长度 section .text global _start _start: ; 从标准输入设备读取字符串 mov eax, 3 ; 系统调用号为3,即read mov ebx, 0 ; 文件描述符为0,即标准输入设备 mov ecx, buffer ; 缓冲区地址 mov edx, 100 ; 缓冲区大小 int 0x80 ; 执行系统调用 ; 计算读取的字符串长度 mov esi, buffer ; 将缓冲区地址存入esi寄存器 xor ecx, ecx ; 将ecx寄存器清零 loop: cmp byte [esi+ecx], 0 ; 比较esi寄存器指向的地址处是否为0 je done ; 如果是,则跳转到done标签 inc ecx ; 将ecx寄存器加1 jmp loop ; 跳转到loop标签 done: mov [len], cl ; 将ecx寄存器的值存储到len变量中 ; 其他操作 ; ... ``` 上面的代码定义了一个100字节大小的缓冲区buffer和一个用于存储字符串长度的变量len。在_start标签处,我们使用read系统调用从标准输入设备读取字符串,并将其存储在buffer中。然后,我们使用一个循环计算读取的字符串长度,将其存储在len变量中。在计算字符串长度时,我们使用了一个类似于C语言中的指针操作——将缓冲区地址存入esi寄存器,然后使用[esi+ecx]的方式访问缓冲区中的每个字符。 需要注意的是,上面的代码仅为示例,实际应用中可能需要添加一些异常处理逻辑,例如输入不合法或输入超出缓冲区大小等情况。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值