用汇编、从键盘读入一个字符串(不超过80个字符),在下一行上原样输出该串
时间: 2024-12-24 10:29:45 浏览: 0
在汇编语言中,我们可以使用INT 21H中断向量来实现从键盘读取字符串的功能。下面是一个简单的MS-DOS x86汇编程序示例,用于完成这个任务:
```assembly
.model small
.stack 100h
.data
msg db '请输入一个字符串(不超过80个字符): $'
input db 81 dup(?), '$' ; 存储输入字符串的空间,最大80个字符加终止符
.code
start:
mov ah, 0Ah ; INT 21H 功能码,读取字符串
lea dx, input ; 指定接收字符串的内存地址
int 21h
mov si, 0 ; 初始化索引
read_loop:
cmp byte ptr [input+si], '$' ; 如果遇到终止符,退出循环
je end_read
mov ah, 2 ; INT 21H 功能码,输出字符
mov dl, [input+si] ; 取出当前字符
int 21h
inc si ; 移动到下一个字符
jmp read_loop
end_read:
mov ah, 4Ch ; 结束程序,返回 DOS
int 21h
end start
```
在这个程序里,首先设置中断功能码为0Ah以读取字符串,然后通过指定输入缓冲区`input`来接收用户输入。之后,遍历输入缓冲区,逐个输出字符,直到遇到终止符为止。
相关问题
汇编编写完整程序,从键盘输入一个字符串STRING,同时,把字符串STRING中的‘&’字符用空格符替代。并显示出替代后字符串及被替代字符的位置
'字符替换为‘#’,并将新字符串输出。
数据存放:
输入字符串:80H
输出字符串:90H
代码如下:
MOV AH, 0AH ;读入字符串
LEA DX, INPUT ;输入缓冲区地址
INT 21H
MOV BX, OFFSET INPUT+1 ;BX指向输入缓冲区第二个字节(跳过长度)
MOV CX, BYTE PTR [INPUT] ;CX存储输入字符串长度
MOV DI, OFFSET OUTPUT+1 ;DI指向输出缓冲区第一个字节
MOV DL, '#' ;要替换的字符
LOOP1:
MOV AL, [BX] ;读入一个字符
CMP AL, 13 ;判断是否为回车符
JE EXIT ;如果是回车符,退出循环
CMP AL, 10 ;判断是否为换行符
JE EXIT ;如果是换行符,退出循环
CMP AL, '\'' ;判断是否为单引号
JE REPLACE ;如果是单引号,执行替换操作
MOV [DI], AL ;将字符存入输出缓冲区
INC BX ;指向下一个字符
INC DI ;指向下一个位置
LOOP LOOP1 ;继续循环
REPLACE:
MOV [DI], DL ;替换为#
INC BX ;指向下一个字符
INC DI ;指向下一个位置
LOOP LOOP1 ;继续循环
EXIT:
MOV BYTE PTR [OUTPUT], DI-OFFSET OUTPUT-1 ;输出字符串长度
MOV AH, 09H ;输出字符串
LEA DX, OUTPUT ;输出缓冲区地址
INT 21H
MOV AH, 4CH ;退出程序
INT 21H
数据段:
INPUT DB 0AH, 00AH, 'Please enter a string: $'
DB 0DH, 0AH, '$'
OUTPUT DB 0AH, 00AH, 'The new string is: $'
DB 0DH, 0AH, '$'
DB 80 DUP ('$') ;输入缓冲区
DB 80 DUP ('$') ;输出缓冲区
程序说明:
1、通过INT 21H,AH=0AH来读入字符串。
2、用BX指向输入缓冲区第二个字节,跳过长度。
3、用CX存储输入字符串长度。
4、用DI指向输出缓冲区第一个字节。
5、用DL存储要替换的字符。
6、用一个循环读入输入字符串中的每个字符。
7、如果读入的字符是回车符或换行符,退出循环。
8、如果读入的字符是单引号,执行替换操作。
9、将读入的字符存入输出缓冲区。
10、继续循环,直到读入整个字符串。
11、替换操作:将DI指向的位置存入#,并将DI、BX分别指向下一个位置。
12、输出新字符串。
使用8086汇编语言 输入一组不超过30个的字符串,在屏幕上输出
以下是一个使用8086汇编语言的程序,可以输入一组不超过30个的字符串,并在屏幕上输出:
```
.model small
.stack 100h
.data
str_arr db 30, 0 ; 字符串数组,最大长度为30
str_len db ? ; 字符串长度
str db 80, 0 ; 缓冲区,用于读入字符串
prompt db 'Enter a string: $'
output db 'You entered: $'
.code
main proc
mov ax, @data ; 初始化数据段寄存器
mov ds, ax
; 循环输入字符串
mov cx, 30 ; 最多输入30个字符串
input_loop:
; 输出提示信息
mov ah, 9
lea dx, prompt
int 21h
; 读入字符串
mov ah, 0ah
lea dx, str
int 21h
; 将字符串复制到数组中
mov si, offset str+1 ; 跳过字符个数的字节
mov di, offset str_arr
mov al, [si]
mov [di], al
mov str_len, al
inc di
inc si
mov cx, str_len
rep movsb
; 判断是否已经输入30个字符串
dec cx
jz input_done
; 继续输入
jmp input_loop
input_done:
; 输出已输入的字符串
mov ah, 9
lea dx, output
int 21h
mov si, offset str_arr
mov cx, 30
output_loop:
mov dl, [si]
cmp dl, 0
jz output_done
mov ah, 2
int 21h
inc si
loop output_loop
output_done:
; 程序结束
mov ah, 4ch
int 21h
main endp
end main
```
这个程序使用了`INT 21h`来输出字符串和读入字符串。具体来说,使用了`AH=0ah`来读入字符串,使用了`AH=9`来输出字符串。在输入字符串时,程序将字符个数和字符串一起读入缓冲区,并将字符串复制到字符串数组中。在输出字符串时,程序遍历字符串数组,并输出每个字符串。
阅读全文