0

アセンブラ コードを学習しようとしています。具体的には、スタックの使用方法とその動作方法などです。ただし、以下のコードを使用するとエラーが発生します。

entry:
    push 0x42
    call teststack
    jmp hang

hang:
    jmp hang

teststack:
    mov ah, 0x0e
    pop al
    mov bh, 0x00
    mov bl, 0x04
    mov cx, 0x01
    int 10h
    ret

私がやろうとしているのは、数値 42 (生命、宇宙、すべて:D) をテストスタック プロシージャに渡すことです。そこで、Ascii 0x42 (大文字の B だと思います) が出力されます。私の問題は、 pop alを読み取る行のコンパイラ エラーです。

**error: invalid combination of opcode and operands**

Windows 98 仮想マシン内で NASM を使用しています。私のエラーの助けをいただければ幸いです。

4

3 に答える 3

1

スタックに値(つまり0x42値)をプッシュすると、スタックには1つの値[0x42]が含まれます。次に、リターンアドレスをスタックに格納する呼び出し命令を使用するため、スタックは[ret_addr、0x42]になります。

最初のサブルーチン命令は値をポップし(予期せず、0x42ではなくret-addrです)、次に他の処理を実行し、スタックからポップされたアドレス(0x42 ...)にジャンプします(ret命令)。

BPレジスタのスタックポインタのコピーを使用して、スタックに格納されている値を読み取り、RET N命令を使用してサブルーチンから戻ることができます(高級言語は同様のシェムを使用します)。

于 2012-05-18T14:15:55.920 に答える
1

NASM を使用したことはありませんが、あなたは 16 ビット モードであり、pop はデフォルトで 16 ビット レジスタを使用していると思われるため、ah は使用できません。0x42 をスタックにプッシュしたとき、それは 16 ビット値 (0x0042) でした。pop axe を使用してから ah を設定しても安全です。

entry:
    push 0x42
    call teststack
    jmp hang

hang:
    jmp hang

teststack:
    pop ax           ; ax = 0x0042
    mov ah, 0x0e     ; ax = 0x0e42
    mov bh, 0x00
    mov bl, 0x04
    mov cx, 0x01
    int 10h
ret
于 2012-05-18T08:47:01.530 に答える
0

プッシュでは、このようにサイズを指定する必要があります

push dword 0x42
于 2012-05-18T08:06:45.283 に答える