5

asmで色付きの線を描きたいです。x86 Intel Linux ユニットでは、AT&T 構文を使用する必要があります。私はすでにかなり進んでいますが、VGA モードまたはモード X に入る方法と、画面にピクセルを配置する方法を知りたいです。標準 C ライブラリ (printf など) にそのための関数はありますか?

どうもありがとうございました。:)

.bss # Declaring uninitialized variables

.data # Declaring initialized variables

.text # Actual assembly code and constants

intro:  .asciz "Draw a line in VGA\n\n"
clr:    .asciz "Give a color \n"
optns:  .asciz "red (1), blue (2), white (3)\n"
res     .asciz "%d"
    ent:    .asciz "\n"

.global main            # Tell kernel where to start (visible from outside)

main: pushl %ebp # Push base pointer movl %esp, %ebp # Initialize base pointer pushl $intro # Push the string address call printf # Call the printf routine from C library addl $8, %esp

pushl $clr          # push color question on the stack
call printf         # Print it

subl $4, %esp               # Reserve stack space for variable
leal -4(%ebp), %eax             # Load address of stack var in eax
pushl %eax          # Push second argument of scanf
pushl $rets         # Push first argument of scanf
call scanf          # Call scanf

    movl 4(%ebp), %ecx              # mov the result in ecx
    cmpl $1, %ecx
    je red
    cmpl $2, %ecx
    je blue
    jne white

red: #... still working on this

    movl 0013h, %eax                # enter 320x200x256 mode
    int 10h                         # IS THIS CORRECT?

    movl $0, %ebx                   # set X to 0
    movl $0, %ecx                   # set Y to 0

    call draw                   # Call line routine

    movl 0003h, %eax                # IS THIS CORRECT?
    int 10h                         # return to text mode

    movl $0, (%esp)             # Make esp 0, indicating succesful termination
    call exit                       # Exit the program

draw:
call putpixel # pushl %ebp # Push the base pointer # movl %esp, %ebp # Initialize base pointer inc %ebx # increment X inc %ecx # increment Y cmpl $200, %ecx # check if Y => 200 jge end # if Y=> 200, jump to end jmp draw # loop

putpxl: #has to put a pixel at (%ebx, %ecx) and return to draw # should use the color from the main routine

end: movl %ebp, %esp # Remove local variables popl %ebp # Remove base pointer ret # return to main routine

4

2 に答える 2

2

Linux (保護された OS) でビデオ (グラフィック モード) を直接出力することはできません。dos (リアルモード OS) でのみ可能でした。

フレームバッファ デバイスまたは SDL、または libX11 を使用できます。しかし、asm から高レベル ライブラリを使用する理由はありません。

Int 10 は Linux では直接許可されていません (ユーザーモードでは、カーネルは低レベルのアクセスを行う必要があります)。

たとえば、これは 5 年前のまったく同じ議論ですhttp://www.gamedev.net/topic/368196-linux-assemblyr-int-10h/

于 2011-07-29T14:45:26.553 に答える
2

SDL や Allegro などの上位レベルのライブラリを使用することをお勧めします。このようにして、プログラムは X11 上および非 VGA フレームバッファ (例: 組み込み ARM ベースのデバイスのディスプレイ) で動作します。

Svgalib では、VGA およびいわゆる SVGA グラフィック カードのプログラミングが可能になりました。その開発は数年前に停止しました。

VGA ハードウェアにアクセスするには、次の 2 つの方法があります。

  • レジスタの使用
  • VGA BIOS の使用: これはあなたが試したものです。VGA BIOS は、リアル モードで実行するように作成されています。それらを保護モードから呼び出すには、vm86 モードに切り替える必要があります。これは、LRMI (Linux Real Mode Interface、DPMI の反対) が行ったことです。
于 2011-07-29T15:17:43.810 に答える