如何修改x86汇编程序实现「姓氏, 名字 中间名」的输出格式?
汇编程序:调整姓名输出格式问题
我编写了一段汇编程序,用于读取用户输入的名字、中间名和姓氏,当前程序会输出「名字 中间名 姓氏」,但需要将输出格式改为「姓氏, 名字 中间名」,示例如下:
用户输入:Jeff Dunlop Aarons
程序输出:Aarons, Jeff Dunlop
我知道需要从姓名的末尾开始反向查找空格,输出找到的姓氏,插入逗号后再输出前面的名字和中间名,但不知道具体如何实现。
原程序代码
include PCMAC.INC .model small .586 .stack 100h .data chars db 80 dup(?) AskName db "Please Enter your full name, First Middle Last, then press enter: $" numChars dw ? .code main proc _Begin _PutStr AskName ;;print the msg to user for what to do _Putch 13, 10 mov numChars, 0 ;;set number of characters to 0 mov bx, offset chars mov cx, 80 ;;THIS PORTION OF THE CODE WILL GET THE NAME AND STORE IT IN BX while_1: _GetCh ;; get the given characer cmp al, 13 ;; compare the user's input to enter??? je end_while1 mov byte ptr [bx], al inc bx inc al dec cx jmp while_1 end_while1: ;; THIS PORTION IS TO PRINT THE NAME BACK OUT mov cx, 80 lea bx, chars xor si, si for_1: mov dl, [bx + si] _Putch inc si dec cx jnz for_1 end_for1: _Exit 0 main endp end main
修改方案与完整代码
首先修正原代码的错误:读取输入时的inc al是无效操作,应改为inc numChars统计实际输入字符数,这是后续反向查找的基础。
核心逻辑:
- 从输入字符串末尾反向遍历,定位第一个空格的位置(姓氏与前半部分的分界)
- 先输出空格后的姓氏部分
- 输出
,分隔符 - 最后输出空格前的名字+中间名部分
修改后的代码:
include PCMAC.INC .model small .586 .stack 100h .data chars db 80 dup(?) AskName db "Please Enter your full name, First Middle Last, then press enter: $" commaSpace db ", $" ;; 预定义逗号加空格的分隔符 numChars dw ? .code main proc _Begin _PutStr AskName ;; 提示用户输入 _Putch 13, 10 mov numChars, 0 ;; 初始化字符计数器 mov bx, offset chars mov cx, 80 ;; 读取用户输入并存储到chars数组 while_1: _GetCh ;; 获取单个字符 cmp al, 13 ;; 判断是否按下回车 je end_while1 mov byte ptr [bx], al inc bx inc numChars ;; 统计输入字符数(修正原代码的错误) dec cx jnz while_1 end_while1: ;; 反向查找第一个空格的位置 mov bx, offset chars add bx, numChars ;; bx指向输入字符串末尾(回车前的最后一个字符) dec bx ;; 调整到最后一个有效字符的位置 find_space: cmp byte ptr [bx], ' ' ;; 判断当前字符是否为空格 je found_space dec bx cmp bx, offset chars ;; 防止数组越界 jge find_space found_space: inc bx ;; bx现在指向姓氏的第一个字符 ;; 输出姓氏部分 mov si, bx print_lastname: mov dl, [si] cmp dl, 0 ;; 遇到数组初始化的0就停止输出 je end_lastname _Putch inc si jmp print_lastname end_lastname: ;; 输出逗号和空格 _PutStr commaSpace ;; 输出名字和中间名部分 mov si, offset chars print_first_middle: cmp si, bx ;; 到分界空格的位置就停止 je end_first_middle mov dl, [si] _Putch inc si jmp print_first_middle end_first_middle: _Exit 0 main endp end main
关键步骤说明
- 字符计数修正:将原代码中错误的
inc al改为inc numChars,准确记录用户输入的字符总数,方便快速定位字符串末尾。 - 反向查找空格:从字符串末尾向前遍历,找到第一个空格后,其下一个位置就是姓氏的起始点,以此拆分姓名的两部分。
- 分段输出:按「姓氏→分隔符→名字+中间名」的顺序分别输出,实现需求的格式转换。
内容的提问来源于stack exchange,提问作者Learning2Code
相关产品推荐
相关产品推荐

