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

为何所有字符串被反转?及考试ALP编程题求解

问题1:为何所有字符串都被反转?

兄弟,这种情况大概率是你的汇编程序里触发反转的逻辑踩坑了,我帮你捋几个常见的原因:

  • 分隔符判断失误:你可能没正确识别“四个空格”这个触发条件——比如只检查了单个空格,或者判断时没遍历满4个字符就认定是分隔符,导致程序误以为第一个字符串就是触发点,直接启动反转逻辑把所有后续字符串都处理了。
  • 反转范围没刹住车:就算识别到了第一个分隔符,你可能没在遇到下一个四个空格时停止反转,而是让反转逻辑一路跑到了字符串组末尾,看起来就像所有字符串都被反转了。
  • 初始状态设反了:比如你默认把反转标志设成了“开启”状态,而不是遇到分隔符才切换,导致程序从第一个字符串开始就执行反转操作。
  • 字符串边界处理错了:每个字符串是4个字符,你可能在遍历时没正确步进4个字节,把多个字符串当成了一个连续块来反转,最终所有内容都被打乱反转了。
问题2:编写检查并反转字符串的ALP程序

我给你写一段基于8086汇编(MASM语法)的代码,每一步都加了注释,方便你理解和调整:

; 8086汇编程序:根据四个空格分隔符反转区间内的字符串
.MODEL SMALL
.STACK 100H

.DATA
    cnt1 DB 10d       ; 待检查的字符串数量,最多20d(可根据实际修改)
    ; 示例数据:包含正常字符串和四个空格分隔符
    dat1 DB 'ABCD', '    ', 'EFGH', 'IJKL', '    ', 'MNOP', 'QRST', 'UVWX', '    ', 'YZ12'
    reverse_flag DB 0 ; 反转控制标志:0=不反转,1=开启反转
    temp DB 4 DUP(?)  ; 临时缓冲区,用于存储单个反转后的字符串

.CODE
MAIN PROC
    ; 初始化数据段
    MOV AX, @DATA
    MOV DS, AX

    ; 设置循环计数器和字符串指针
    MOV CX, 0
    MOV CL, cnt1      ; CX = 总字符串数
    MOV SI, 0         ; SI指向当前字符串的起始偏移量

LOOP_START:
    ; 第一步:检查当前字符串是否为四个空格
    MOV DI, 0
    MOV BL, 0         ; BL统计匹配的空格数量
CHECK_SPACE_LOOP:
    MOV AL, dat1[SI+DI]
    CMP AL, ' '
    JNE NOT_SPACE_STRING ; 不是空格,跳出检查
    INC BL
    INC DI
    CMP DI, 4
    JNE CHECK_SPACE_LOOP ; 没检查满4个字符,继续

    ; 走到这里说明是四个空格分隔符,切换反转标志
    XOR reverse_flag, 1
    JMP NEXT_STRING ; 跳过反转处理,直接到下一个字符串

NOT_SPACE_STRING:
    ; 判断是否需要反转当前字符串
    CMP reverse_flag, 1
    JNE SKIP_REVERSE ; 不需要反转,直接跳转到下一个字符串

    ; 反转当前4字符字符串:从末尾到开头存入临时缓冲区
    MOV DI, 0
REVERSE_CURRENT:
    MOV AL, dat1[SI + 3 - DI] ; 取字符串的第(3-DI)个字符(0-based)
    MOV temp[DI], AL
    INC DI
    CMP DI, 4
    JNE REVERSE_CURRENT

    ; 将反转后的字符串写回原地址
    MOV DI, 0
STORE_REVERSED:
    MOV AL, temp[DI]
    MOV dat1[SI + DI], AL
    INC DI
    CMP DI, 4
    JNE STORE_REVERSED

SKIP_REVERSE:
    ; 移动到下一个字符串(每个字符串占4字节)
    ADD SI, 4
    LOOP LOOP_START ; 循环处理所有字符串

    ; 程序正常退出
    MOV AH, 4CH
    INT 21H
MAIN ENDP
END MAIN

代码关键点说明:

  • 用reverse_flag作为开关,每次遇到四个空格就切换反转状态
  • 每个字符串独立处理,反转时借助临时缓冲区避免覆盖原数据
  • 严格按4字节步进,确保不会跨字符串处理,符合题目中“每个字符串长度为4个字符”的要求

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 09:14:00