1

だから私はこのプログラムを持っています:


[BITS 16]
[ORG 7C00h]

    JMP 0:start

start:
    MOV AX, 0
    MOV DS, AX
    MOV ES, AX
    MOV SS, AX
    MOV SP, 7C00h

    MOV SI, Hello
    CALL _puts16
    MOV AL, LogLvl1
    INT 21h
    CALL .getinput
.getinput:
    MOV AH, 2h
    MOV AL, Success ;Echo was successful
    INT 21h
    MOV AH, 1h ;Set AH to 1h, which means character input
    INT 21h
    MOV INPUT, AL ;Store the character in INPUT
    MOV AH, 2h ;Change AH back to 2h, which means character output
    MOV DL, Message ;Move Message to DL, which will be echoed
    INT 21h
    MOV DL, INPUT ;Move the inputed key to DL to be echoed
    INT 21h
    RET
;input= es:si -> string
_puts16:
    PUSHA

.BEGIN:
    LODSB ;Load a single byte
    CMP AL, 0 ;Calculate if that byte is 0, or null
    JE .END ;Jump to end if it is not 0

    MOV AH, 0Eh ;Otherwise, set 24 bit graphics modes
    INT 10h
    JMP .BEGIN

.END:
    POPA
    RET
.define:
    Hello DB "Enter a string: ",0
    Message DB "        Grats! You said",0
    INPUT DB " ",0
    LogLvl1 DB "Calling .getinput...\n",0
    Success DB "Successful.\n",0
times 510 - ($ - $$) db 0

DW 0xAA55

私はアセンブリに非常に慣れていないため、.define で定義されている文字列変数 "INPUT" に入力されたキーを移動する必要がありますが、ネットワイド アセンブラで次のエラーが表示されます。

1.asm:24: エラー: オペコードとオペランドの組み合わせが無効です

何らかの理由で AL を INPUT に移動できないことを意味すると思いますが、その理由はわかりません。私が言ったように、私は組み立てに慣れていないので、おそらく明らかな間違いです。どうすればこれを修正できますか? 後でプログラムでエコーするために、入力した文字またはキーをメモリに保存する必要があります。

4

1 に答える 1

1

AL基本的に、スペース文字のアドレスに定数に格納しようとしているためです。アセンブラー (またはコンパイラー) に 2 を 1 に割り当てるように要求するようなものです。

命令を に変更しmov [INPUT], alます。

この同じ問題のいくつかのインスタンスがあり、メモリの内容とメモリアドレスを混同しているようです。

int 21hまた、 PC がディスクからブート セクタを起動するときは、DOSは使用できません。代わりにBIOS 機能 (int 16hおよび など) を使用してください。int 10h

于 2013-03-29T15:53:28.157 に答える