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