汇编语言 从键盘输入字符:EAX=数字 ;判断范围
时间: 2024-02-16 11:30:33 浏览: 18
对于汇编语言来说,从键盘输入字符需要使用中断来实现,具体步骤如下:
1. 使用INT 21h中断,功能号为0Ah,将键盘输入的字符存储到缓冲区中。
2. 将缓冲区中的字符读入寄存器EAX中。
3. 判断EAX寄存器中的值是否在指定范围内,可以使用CMP指令进行比较,然后根据比较结果进行相应的处理。
示例代码如下:
```
MOV AH, 0Ah ; 功能号为0Ah,从键盘输入字符
MOV DX, OFFSET buffer ; 缓冲区地址
INT 21h ; 调用中断
MOV AH, 0 ; 功能号为0,从AL寄存器读入字符
MOV AL, [buffer+2] ; 缓冲区中字符的偏移量为2
SUB AL, 30h ; 将字符转换为数字,30h为ASCII码中的'0'
MOV EAX, 123 ; 指定范围
CMP EAX, 100 ; 判断是否大于等于100
JB less_than_100 ; 如果小于100,则跳转到less_than_100标签
JMP end ; 否则直接跳转到end标签
less_than_100:
; 处理小于100的情况
JMP end
end:
; 程序结束
```
以上代码仅为示例,具体实现要根据具体需求进行修改。
相关问题
汇编代码:从键盘输入字符:EAX=数字
下面是一个简单的汇编代码,用于从键盘输入一个数字,存储在EAX寄存器中:
```
input_num:
mov ah, 01h ; 从键盘读取一个字符
int 21h ; 调用21h中断
sub al, '0' ; 将ASCII码转换为数字
cmp al, 0 ; 判断是否为0
je input_num ; 如果是0则重新输入
cmp al, 10 ; 判断是否大于10
ja input_num ; 如果大于10则重新输入
ret ; 返回输入的数字存储在EAX中
```
其中,int 21h是调用DOS系统的中断函数,用于从键盘读取一个字符,sub al, '0'是将ASCII码转换为数字,cmp al, 0和cmp al, 10是用于判断输入的数字是否符合要求(在1~10之间)。如果输入的数字不符合要求,则程序会要求用户重新输入。最后,ret指令将输入的数字存储在EAX寄存器中并返回。
地址表程序。程序功能: 1)提示输入数字,并输入数字; 2)判断数字是否在规定的范围内,不在范围内、重新输入; 3)显示数字对应的信息,退出。 ;数据段 msg1 byte 'Chapter 1: Fundamentals',0dh,0ah,0 …… ;共有10个信息 msg byte 'Input number(1~10): ',0dh,0ah,0 table dword ;共有10个地址表元素 ;代码段 again: mov eax,offset msg call dispmsg ;提示输入 ;从键盘输入字符:EAX=数字 ;判断范围 jb again cmp eax,10 ja again ;不在范围内,重新输入 dec eax ;EAX=EAX-1 ;EAX=EAX×4 jmp table[eax] ;多分支跳转 disp1: mov eax,offset msg1 jmp disp disp2: mov eax,offset msg2 jmp disp …… disp9: mov eax,offset msg9 jmp disp disp10: mov eax,offset msg10 disp: call dispmsg ;显示
这段汇编程序的主要功能是根据用户输入的数字,在10个信息中显示相应的信息。程序会提示用户输入一个数字,然后根据用户输入的数字进行分支跳转,跳转到相应的地址去执行相应的代码,从而实现不同分支的功能。
具体来说,程序首先会调用dispmsg函数,显示提示信息“Input number(1~10): ”,然后从键盘读取一个数字,存储在EAX寄存器中。程序会判断用户输入的数字是否在1~10之间,如果不在范围内,程序会要求用户重新输入数字。如果用户输入的数字符合要求,程序会将其减一,并将其乘以4,然后跳转到一个地址表中相应的地址执行代码。在这个地址表中,每个地址对应一个信息,程序会根据不同的数字跳转到不同的地址,然后显示相应的信息。
下面是完整的汇编代码:
```
;数据段
msg1 byte 'Chapter 1: Fundamentals',0dh,0ah,0
;共有10个信息
msg byte 'Input number(1~10): ',0dh,0ah,0
table dword offset disp1, offset disp2, offset disp3, offset disp4, offset disp5, offset disp6, offset disp7, offset disp8, offset disp9, offset disp10
;共有10个地址表元素
;代码段
again:
mov eax, offset msg
call dispmsg ; 显示提示信息
input_num:
mov ah, 01h ; 从键盘读取一个字符
int 21h ; 调用21h中断
sub al, '0' ; 将ASCII码转换为数字
cmp al, 0 ; 判断是否为0
jb again ; 如果是0则重新输入
cmp al, 10 ; 判断是否大于10
ja again ; 如果大于10则重新输入
dec eax ; EAX=EAX-1
shl eax, 2 ; EAX=EAX×4
jmp dword ptr table[eax] ; 多分支跳转
disp1:
mov eax, offset msg1
jmp disp
disp2:
mov eax, offset msg2
jmp disp
; 其他disp3~disp9省略
disp10:
mov eax, offset msg10
disp:
call dispmsg ; 显示信息
ret
dispmsg:
mov ah, 09h ; 调用09h中断
int 21h
ret
```
在这段代码中,dispmsg函数用于显示指定的信息,jmp dword ptr table[eax]指令用于进行多分支跳转,table变量用于存储10个地址表元素。