为何所有字符串被反转?及考试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
相关产品推荐
相关产品推荐

