You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改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

关键步骤说明

  1. 字符计数修正:将原代码中错误的inc al改为inc numChars,准确记录用户输入的字符总数,方便快速定位字符串末尾。
  2. 反向查找空格:从字符串末尾向前遍历,找到第一个空格后,其下一个位置就是姓氏的起始点,以此拆分姓名的两部分。
  3. 分段输出:按「姓氏→分隔符→名字+中间名」的顺序分别输出,实现需求的格式转换。

内容的提问来源于stack exchange,提问作者Learning2Code

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 07:20:12