【发布时间】:2021-03-16 02:24:41
【问题描述】:
目前,我创建了一个程序,允许我输入字符串并将其反转。它做我想做的事,我认为这是最好的方式。现在我想反转大小写的意思,当有人进入 Hello World 时,它会输出 DLORw OLLEh
我不确定解决此问题的最佳方法是什么。我已经查看了平台上的其他解决方案,但在尝试使一切井井有条时遇到了一些困难。如果有任何改进我当前代码的建议,我也很感激
下面是我目前的代码:
include 'emu8086.inc'
org 100h
CALL STRING_INPUT
RET
STRING_INPUT PROC
PRINT "Enter a string to reverse it: "
LEA DI, buffer ; put string inside so we can read it later
MOV DX, buffSize
CALL GET_STRING
PRINTN
MOV SI, DI
MOV CX, 0h ; character count of string
STRING_INPUT ENDP
STRING_REVERSE PROC
ReadInput:
;check for last character
MOV AX, [SI]
CMP AL, 0
JE CreateReverse
PUSH [SI] ; push inside stack
; count each character
INC SI
INC CX
JMP ReadInput
CreateReverse: ;
MOV SI, DI ; set input again
MOV AX, CX ; store length of input
BuildString:
CMP CX,0
JE PrintReversedInput
POP DX
MOV DH, 0
MOV [SI], DX ;set si to the reversed string character
INC SI
DEC CX
JMP BuildString
PrintReversedInput:
MOV SI, DI
PRINT "Reversed String: "
CALL PRINT_STRING
RET
STRING_REVERSE ENDP
buffer DB 20 DUP (?) ;set input max size for get_string
buffSize = $-buffer
DEFINE_GET_STRING
DEFINE_PRINT_STRING
END
【问题讨论】:
-
ASCII 被排列成大小写字母相差 32 个位置。因此,您可以通过将字母与常量 32 进行异或来反转字母的大小写。请注意,您可能需要首先检查该字符是否实际上是字母。
-
最简单的方法可能是使用查找表,部分原因是代码可以将所有字符视为相同(不关心字符是否为字母)。
-
@Brendan 是否有任何资源显示如何使用查找表?似乎无法在线找到 x86 的任何资源
-
@NateEldredge 是否有必要检查字符是否为字母?例如,如果用户输入中有空格,这意味着字符数也将与常数 32 异或?我忽略了用户可以输入数字的事实,让我们假设用户是值得信赖的哈哈
-
是的,这是必要的。例如,如果有空格,则与 32 进行异或运算会将其更改为 NUL,这肯定不会打印为空格。