1

Cコードで次の関数を呼び出して、画面に文字を表示しようとしています:

.global _putInMemory

;void putInMemory (int segment, int address, char character)
    _putInMemory:
        mov bp,sp
        push ds
        mov ax,[bp+2]
        mov si,[bp+4]
        mov cl,[bp+6]
        mov ds,ax
        mov [si],cl
        pop ds
        ret

このような:

    int segment_start = 0xB000;
    putInMemory(segment_start, 0x8140, 'R');
    putInMemory(segment_start, 0x8141, 0x1F);
    putInMemory(segment_start, 0x8142, 'A');
    putInMemory(segment_start, 0x8143, 0x1F);

ただし、これは色なしで最初の文字のみを表示しますが、次のようにコードで指定すると、問題なく動作します。

putInMemory(0xB000, 0x8140, 'R');
putInMemory(0xB000, 0x8141, 0x1F);
putInMemory(0xB000, 0x8142, 'A');
putInMemory(0xB000, 0x8143, 0x1F);

int を変数に格納すると機能しない理由がわかりません。int小さすぎますか?bccコンパイラ を使用しています

編集: 正しいコードは次のようになります。

;void putInMemory (int segment, int address, char character)
_putInMemory:
    push bp
    mov bp,sp
    push ds
    mov ax,[bp+4]
    mov si,[bp+6]
    mov cl,[bp+8]
    mov ds,ax
    mov [si],cl
    pop ds
    pop bp
    ret
4

1 に答える 1

1

呼び出し規約のbcc使用法を理解し、従っていることを確認してください。典型的なコンパイラは、(とりわけ) レジスタbpとレジスタが関数呼び出し間で保持されることを期待します。siコンパイラはローカル変数bpをアドレス指定するために使用している可能性がありsegment_startますが、破棄bpすると、2 回目の関数呼び出しで代わりにガベージが渡され、観察された動作が生成されます。

を保存して復元bpsi( の場合と同じようにds)、問題が解決するかどうかを確認してください。

于 2013-06-10T22:53:35.457 に答える