程序集中的数据类型转换

时间:2013-03-29 17:34:31

标签: assembly x86 dos

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

问题:我创建的STRLEN1变量实际上是DB类型,因此会出现"Operand types do not match"错误。

可能的解决方案:创建DDDW类型的另一个变量,并将值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 个答案:

答案 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使用数据字而不是字节吗?它看起来不会破坏你的代码,它会省去你做转换的麻烦。