这是我的计划。它需要输入两个字符串,计算它们的长度,检查长度是否相等。如果长度相等,则反转第一个字符串并检查它是否等于秒。如果长度不相等或者在反转之后字符串不相同,程序将打印"String is not palindrome"
否则"String is palindrome"
。我知道这不是真正的回文类型解决方案,但这是我想要做的。
问题:我创建的STRLEN1
变量实际上是DB
类型,因此会出现"Operand types do not match"
错误。
可能的解决方案:创建DD
或DW
类型的另一个变量,并将值STRLEN1
存储到新创建的STRLEN1_ DW
变量中。这就是问题所在,我不知道该怎么做。
在google上搜索了很多内容后,我发现https://www.hex-rays.com/products/ida/support/idadoc/453.shtml并尝试使用它,但只有一个错误添加到列表中:NEED EXPRESSION
。我不知道如何解决这个问题。
DATA SEGMENT
STR1 DB 'ENTER STRING ONE : $'
STR2 DB 'ENTER STRING TWO : $'
STR_PALIN DB "STRING IS PALINDROME$"
STR_NOT_PALIN DB "STRING IS NOT PALINDROME$"
INSTR1 DB 20 DUP("$")
INSTR2 DB 20 DUP("$")
RSTR DB 20 DUP("$")
NEWLINE DB 10,13,"$"
STRLEN1 DB 0
STRLEN2 DB 0
STRLEN1_ DW 0
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE, DS:DATA
START:
MOV AX, DATA
MOV DS, AX
MOV ES, AX
LEA SI, INSTR1
LEA DI, INSTR2
;GET STRING
MOV AH, 09H
LEA DX, STR1
INT 21H
MOV AH, 0AH
MOV DX, SI
INT 21H
MOV AH, 09H
LEA DX, NEWLINE
INT 21H
;GET LENGTH OF STRING ONE
MOV BL, INSTR1+1
ADD BL, 30H
MOV STRLEN1, BL
;TAKE SECOND INPUT OF THE STRING
MOV AH, 09H
LEA DX, STR2
INT 21H
MOV AH, 0AH
MOV DX, DI
INT 21H
MOV AH,09H
LEA DX,NEWLINE
INT 21H
;GET LENGTH OF STRING 2
MOV BL, INSTR2+1
ADD BL, 30H
MOV STRLEN2, BL
;COMPARE STRING LENGTH
MOV CX, 6
MOV AL, STRLEN1
MOV BL, STRLEN2
CMP AL, BL
JNE NOT_PALIN
;REVERSE STRING ONE
MOV STRLEN1 -> STRLEN1_
MOV CX, STRLEN1
MOV CX, -2
LEA DI, RSTR
ADD SI, STRLEN1
ADD SI, -2
L1:
MOV AL, [SI]
MOV [DI], AL
DEC SI
INC DI
LOOP L1
MOV AL, [SI]
MOV [DI], AL
INC DI
MOV DL, '$'
MOV [DI], DL
MOV CX, STRLEN1
LEA SI, RSTR
LEA DI, INSTR2
REPE CMPSB
JNE NOT_PALIN
JMP PALIN
NOT_PALIN:
MOV AH, 09H
LEA DX, STR_NOT_PALIN
INT 21H
JMP EXIT
PALIN:
MOV AH, 09H
LEA DX, STR_PALIN
INT 21H
JMP EXIT
EXIT:
MOV AX, 4CH
INT 21H
CODE ENDS
END START
答案 0 :(得分:0)
如果我正确理解您,则无法使用字节大小的值初始化16位CX寄存器。有几种方法可以做到这一点 - 最直接的可能是:
XOR CX, CX ; set CX to zero
MOV CL, STRLEN
CX现在等于STRLEN。
答案 1 :(得分:0)
如果您想将STRLEN1
复制到STRLEN1_
,可以执行以下操作:
MOVZX AX, BYTE PTR [STRLEN1] ; Zero-extend STRLEN1 into AX
MOV [STRLEN1_], AX
或,您只需将STRLEN1
定义为db 0,0
并保持高字节清晰。
MOV [STRLEN1], BL
ADD SI, WORD PTR [STRLEN1] ; Whether WORD PTR needs to be specified depends
; on the assembler
答案 2 :(得分:0)
您可以为STRLEN1和STRLEN2使用数据字而不是字节吗?它看起来不会破坏你的代码,它会省去你做转换的麻烦。