1

这是我的程序。它接受两个字符串的输入,计算它们的长度,检查长度是否相等。如果长度相等,它将反转第一个字符串并检查它是否等于第二个。如果长度不相等或反转后的字符串不相同,则程序将打印"String is not palindrome"否则"String is palindrome"。我知道这不是实际的回文类型解决方案,但这是我想做的。

问题:STRLEN1我创建的变量实际上是一个DB类型,所以它给出了一个"Operand types do not match"错误。

可能的解决方案:创建另一个DDorDW类型的变量并将值存储STRLEN1到新创建的STRLEN1_ DW变量中。这就是问题所在,我不知道该怎么做。

在谷歌上搜索了很多之后,我发现了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
4

3 回答 3

0

如果我对您的理解正确,那么您将无法使用字节大小的值初始化 16 位 CX 寄存器。有几种方法可以做到这一点 - 最直接的可能是:

  XOR CX, CX     ; set CX to zero
  MOV CL, STRLEN

CX 现在等于 STRLEN。

于 2013-03-29T17:41:33.080 回答
0

如果你想复制STRLEN1STRLEN1_你可以这样做:

MOVZX AX, BYTE PTR [STRLEN1] ; Zero-extend STRLEN1 into AX
MOV [STRLEN1_], AX

或者,您可以简单地定义STRLEN1db 0,0并保持高字节清晰。

MOV [STRLEN1], BL
ADD SI, WORD PTR [STRLEN1]   ; Whether WORD PTR needs to be specified depends
                             ; on the assembler
于 2013-03-29T17:46:01.977 回答
0

您能否对 STRLEN1 和 STRLEN2 使用数据字而不是字节?看起来这不会破坏您的代码,并且可以省去您进行转换的麻烦。

于 2013-03-29T17:52:01.600 回答