1

私は単純なプログラムを持っていて、それを読まなければなりませんPCI configuration space(最初のPCIデバイスのためだけに)。しかし、それは機能しません。YASM:

18: warning: value doesnt fit in 8 bit fild
19: warning: value doesnt fit in 8 bit fild

コードは次のとおりです。

   [use    32]
    [org    0x7c00]

start:
    mov     ah, 0x3
    int     0x10        ;clear screen
;forming the PCI address

    push    ax
    or      ah, 10000000b
    xor     al, al
    or      al, 00000001b
    shl     eax, 16
    pop     ax
    xor     al, al
    xor     ah, ah
    push    eax
    out     0xcf8, eax
    in      eax, 0xcfc
    mov     edi, field
    stosd   
    mov     si, di
    call    print_str
    ret
field:      
print_str:
;print a string in si
    mov     ax, 0xb800
    mov     es, ax
    xor     di, di
    mov     cx, 128
    rep     movsw
    ret

    times   510 - ($ - $$) db 0
    dw      0xaa55

ありがとう。

PS私はエミュレーションにBochsを使用し、アセンブラーとしてYASMを使用しています

4

1 に答える 1

3

outまたはin16ビットのイミディエートポート番号を使用することはできません。inおよびについては、 8ビットの即時ポート番号のみが可能ですout

dxしたがって、ポート番号を次の場所に保存する必要があります。

mov dx、0xcf8
dx、eaxから
eax、dxで

次に、以下のブロックにいくつかの問題があります。

mov edi、field
stosd
mov si、di
print_strを呼び出す
ret
分野:      
print_str:
;siで文字列を出力します
mov ax、0xb800
mov es、ax
xor di、di
mov cx、128
rep movsw
ret

編集:タイプミスを修正しました。「予約しないでください」とすべきです。修正しました。

上記のブロックにはいくつかの問題があります。ediまず、何かを保存するメモリへのインデックスとして使用したいとします。ただし、その目的のためにメモリを予約しないため、ポートから読み取った値(最初に直接の16ビットポート番号を修正した場合)でmov ax,0xb80066 b8 00 b8正確に4バイト)上書きできます。eax0xcf8

第二に、ブートローダーコードのデフォルトでポイントがどこにあるのか正確にはわかりませんがes、とにかく、最初に次のように設定する必要があるかもしれません。

プッシュcs
pop es

メモリを予約するには:

分野:
4倍db0; 4バイトを予約します(ただし、さらに必要になる場合がありますが、
             ; 理由を理解するために読み続けてください)

しかし、これはまだ十分ではありません。から読み取った数値をで出力する場合は、最初にそれを文字列に0xcfc変換eaxするrep movsw必要があります。x86アセンブリ(10進数または16進数)で数値を文字列に変換することは、SOで非常に頻繁に行われるため、以前の回答を確認して、次のことを理解してください。

このコードは正しいですか(数値と数値を加えて、結果を出力します)

数字に含まれる文字数と同じ数のバイトが必要になることに注意してください。使用する場合は、2 x文字数が必要ですrep movsw(以下を参照)。

次に、ビデオメモリへの書き込みに使用されるコードでは、変換せずにバイナリ値をビデオメモリにコピーしているように見えます。したがって、上記の2つの修正を行った後、最初の行の最初の64文字に色付きの文字が表示される可能性があります。OSなしで文字列を印刷することに関するSOの質問に対する私の最近の回答を参照してください。これには、2つの異なる方法のサンプルコードがあります。

お役に立てれば。

于 2013-03-22T16:03:46.180 に答える