汇编程序输入输出问题:实现姓名、年龄、国家的输入与输出
汇编程序修复与扩展:实现姓名、年龄、国家的输入输出
原程序问题分析
- 输入缓冲区格式不符合要求:
int 21h的ah=10(0Ah)字符串输入功能,要求缓冲区必须是「第一个字节存最大输入长度,第二个字节存实际输入长度,后续字节存输入字符」的结构,原程序直接用dup('$')定义缓冲区,导致输入逻辑异常。 - 变量操作错误:年龄输入时错误修改了姓名缓冲区
Arr的长度,且操作方式不符合缓冲区规范。 - 缺少输出逻辑:仅实现姓名输出,未处理年龄的输出,更没有国家输入输出的相关代码。
修复并扩展后的完整代码
data segment ; 输入提示字符串 str1 db "What is your name: $" str2 db "How old are you? $" str3 db "Which country are you from? $" ; 输出前缀字符串 str4 db 13,10, "Name Output is: $" str5 db 13,10, "Age Output is: $" str6 db 13,10, "Country Output is: $" ; 输入缓冲区遵循0Ah功能格式:[最大长度][实际长度][字符存储区] name_buf db 10, ?, 10 dup('$') ; 最多输入9个字符(留1位给结束符) age_buf db 4, ?, 4 dup('$') ; 最多输入3个字符(适配年龄范围) country_buf db 15, ?, 15 dup('$'); 最多输入14个字符 ends stack segment dw 128 dup(0) ends code segment start: mov ax, @data mov ds, ax ; 输入姓名 lea dx, str1 mov ah, 09h int 21h mov ah, 0Ah lea dx, name_buf int 21h call print_newline ; 输入年龄 lea dx, str2 mov ah, 09h int 21h mov ah, 0Ah lea dx, age_buf int 21h call print_newline ; 输入国家 lea dx, str3 mov ah, 09h int 21h mov ah, 0Ah lea dx, country_buf int 21h call print_newline ; 输出姓名 lea dx, str4 mov ah, 09h int 21h call print_buffer, name_buf ; 输出年龄 lea dx, str5 mov ah, 09h int 21h call print_buffer, age_buf ; 输出国家 lea dx, str6 mov ah, 09h int 21h call print_buffer, country_buf ; 退出程序 mov ax, 4c00h int 21h ; 辅助子程序:打印换行符 print_newline proc mov dl, 13 mov ah, 02h int 21h mov dl, 10 mov ah, 02h int 21h ret print_newline endp ; 辅助子程序:打印0Ah格式的缓冲区内容 print_buffer proc push bp mov bp, sp mov si, [bp+4] ; 在输入字符末尾添加$,适配09h输出功能 mov cl, [si+1] mov ch, 0 add si, 2 add si, cx mov byte ptr [si], '$' ; 输出字符串 lea dx, [bp+4] add dx, 2 mov ah, 09h int 21h call print_newline pop bp ret 2 print_buffer endp ends end start
关键修改说明
- 标准化输入缓冲区:严格按照
int 21h0Ah功能要求定义缓冲区,避免输入逻辑错误。 - 新增辅助子程序:把重复的换行、输出逻辑封装成子程序,减少冗余代码,提升可读性。
- 扩展功能:新增国家的输入提示、缓冲区及输出逻辑,满足需求。
- 修复变量错误:移除原程序中错误的缓冲区长度赋值操作,让0Ah功能自动处理实际输入长度的填充。
内容的提问来源于stack exchange,提问作者John Paulo Pascua
相关产品推荐
相关产品推荐

