3)编制一程序,从键盘输入两个长度不同的字符串,设字符串长度小于25个字符。要求在屏幕上以右边对齐的形式显示出来。 编程要点: (i)在数据段中设置两个存放提示信息的字符串,一个是提示用户输入,另一个是指示显示信息位置; (ii)在数据段中设置两个存放输入字符串的缓冲区; (iii)输入字符串采用0AH号DOS功能调用,字符串存入缓冲区时,第2个字节为实际输入字符串的长度,从第3个字节开始为字符串的ASCII码。 (iv)为了实现显示的右对齐,由于两个字符串缓冲区的长度相同,只需要将两个字符串向缓冲区后面靠齐,再调用09H号DOS功能调用即可达到显示的右对齐。用emu8086编写相关程序
时间: 2025-06-25 21:10:55 浏览: 14
### emu8086 实现键盘输入两个字符串并右对齐显示
以下是一个完整的 emu8086 汇编程序,能够从键盘接收两个长度不超过 25 的字符串,并将它们以右边对齐的方式显示在屏幕上。该程序利用了 DOS 功能调用来完成字符串的输入和输出。
#### 程序设计思路
1. 使用 DOS 功能调用 `AH=0Ah` 来获取用户输入的字符串。
2. 输入完成后计算每个字符串的实际长度。
3. 找出较长的那个字符串作为基准宽度。
4. 根据较短字符串与最长字符串之间的差值,在打印之前填充适当数量的空格,从而实现右对齐效果。
5. 输出最终结果。
```assembly
data segment
max_len db 26 ; 最大缓冲区大小 (包括回车符)
input_length_1 db ? ; 用户实际输入的第一个字符串长度
buffer_1 db 26 dup(?) ; 第一个字符串缓冲区
input_length_2 db ? ; 用户实际输入的第二个字符串长度
buffer_2 db 26 dup(?) ; 第二个字符串缓冲区
newline db 0Dh, 0Ah, '$' ; 换行符
data ends
stack segment
dw 100h dup(?)
stack ends
code segment
assume cs:code, ds:data, ss:stack
start:
mov ax, data ; 初始化数据段
mov ds, ax
; 提示用户输入第一个字符串
lea dx, prompt_msg_1
mov ah, 09h ; DOS功能调用:显示消息
int 21h
; 接收第一个字符串
lea dx, buffer_1
mov ah, 0Ah ; DOS功能调用:接受带缓冲区的输入
int 21h
; 提示用户输入第二个字符串
lea dx, prompt_msg_2
mov ah, 09h
int 21h
; 接收第二个字符串
lea dx, buffer_2
mov ah, 0Ah
int 21h
; 计算两个字符串的实际长度
mov al, [input_length_1]
cbw ; 将AL扩展为AX(用于后续比较)
mov bx, ax ; BX = 第一个字符串长度
mov al, [input_length_2]
cbw ; 将AL扩展为AX
mov cx, ax ; CX = 第二个字符串长度
; 找到最大长度
cmp bx, cx
jge first_longer_or_equal ; 如果BX >= CX,则第一个字符串更长或相等
xchg bx, cx ; 否则交换BX和CX,使BX始终表示较大值
first_longer_or_equal:
; 显示第一个字符串(右对齐)
sub bx, [input_length_1] ; 计算需要补充的空格数
mov cl, bl
mov ch, 0 ; 清零CH以便使用CX作为计数器
print_spaces_for_first:
dec cx ; 减少计数器
js skip_print_spaces_first ; 如果CX<0,则跳过
mov dl, ' '
mov ah, 02h ; DOS功能调用:显示单个字符
int 21h
jmp print_spaces_for_first
skip_print_spaces_first:
lea dx, buffer_1 + 2 ; DX指向实际字符串部分(跳过前两位)
mov ah, 09h ; DOS功能调用:显示字符串
int 21h
; 换行
lea dx, newline
mov ah, 09h
int 21h
; 显示第二个字符串(右对齐)
mov ax, bx ; AX恢复最大长度
sub ax, [input_length_2] ; 计算需要补充的空格数
mov cx, ax
print_spaces_for_second:
dec cx ; 减少计数器
js skip_print_spaces_second ; 如果CX<0,则跳过
mov dl, ' '
mov ah, 02h ; DOS功能调用:显示单个字符
int 21h
jmp print_spaces_for_second
skip_print_spaces_second:
lea dx, buffer_2 + 2 ; DX指向实际字符串部分(跳过前两位)
mov ah, 09h ; DOS功能调用:显示字符串
int 21h
; 结束程序
mov ah, 4Ch ; 返回DOS
int 21h
prompt_msg_1 db 'Enter the first string (max length 25): $'
prompt_msg_2 db 'Enter the second string (max length 25): $'
code ends
end start
```
---
### 关键点解析
1. **字符串输入**
使用 DOS 功能调用 `AH=0Ah` 可以方便地读取带有缓冲区的字符串输入[^1]。此功能会自动记录用户的输入长度以及具体字符内容。
2. **字符串长度计算**
在缓冲区中,第 2 字节存储的是用户实际输入的有效字符数。通过访问这一字段即可轻松获得字符串的真实长度[^3]。
3. **右对齐逻辑**
- 首先找到两个字符串中最长者的长度作为基准宽度。
- 对于每一个字符串,如果它的长度小于基准宽度,则在其前面补足相应数量的空格,直到达到基准宽度为止[^4]。
4. **屏幕输出**
利用 DOS 功能调用 `AH=09h` 或 `AH=02h` 分别实现了整串输出和单字符输出的功能[^1]。
---
###
阅读全文