Преобразование типов данных в сборке

Это моя программа. Он принимает на вход две строки, вычисляет их длину, проверяет, равны ли длины. Если длины равны, он переворачивает первую строку и проверяет, равна ли она второй или нет. Если длины не равны или строки не совпадают после их обращения, программа печатает "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

3 ответа

Если вы хотите скопировать 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

Если я вас правильно понимаю, у вас возникли проблемы при инициализации 16-битного регистра CX с байтовым значением. Есть несколько способов, которыми вы можете сделать это - самый прямой, вероятно, это:

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

CX теперь равен STRLEN.

Не могли бы вы использовать слова данных вместо байтов для STRLEN1 и STRLEN2? Не похоже, что это сломало бы ваш код и избавило бы вас от необходимости выполнять преобразование.

Другие вопросы по тегам