1

これが私のプログラムです。2 つの文字列を入力し、それらの長さを計算し、長さが等しいかどうかをチェックします。長さが等しい場合、最初の文字列を反転し、2 番目と等しいかどうかをチェックします。長さが等しくない場合、または文字列を反転した後に文字列が同じでない場合、プログラムはそれ以外の場合を出力し"String is not palindrome"ます"String is palindrome"。これは実際の回文型のソリューションではないことはわかっていますが、これが私がやりたかったことです。

問題:STRLEN1作成した変数は実際にはDB型であるため、"Operand types do not match"エラーが発生します。

考えられる解決策: DDor型の別の変数を作成し、値を新しく作成した変数にDW保存します。これが問題で、やり方がわかりません。STRLEN1STRLEN1_ DW

グーグルでたくさん検索した後、これは私が見つけたものですhttps://www.hex-rays.com/products/ida/support/idadoc/453.shtmlそしてそれを使用しようとしましたが、リストに追加されたエラーがもう1つしかありません: 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

STRLEN1 と STRLEN2 にバイトの代わりにデータ ワードを使用できますか? それによってコードが壊れるようには見えず、変換を行う手間を省くことができます。

于 2013-03-29T17:52:01.600 に答える
0

にコピーSTRLEN1したい場合は、次のSTRLEN1_ことができます。

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

またはSTRLEN1、単純に asを定義しdb 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

私の理解が正しければ、16 ビットの CX レジスタをバイト サイズの値で初期化する際に問題が発生しています。それを行うにはいくつかの方法があります-最も簡単なのはおそらく次のとおりです。

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

CX は STRLEN と等しくなります。

于 2013-03-29T17:41:33.080 に答える