【问题标题】:Help on VGA and putpixel intel x86 asm AT&T syntaxVGA 和 putpixel intel x86 asm AT&T 语法的帮助
【发布时间】:2011-10-16 00:48:42
【问题描述】:

我想在 asm 中画一条彩色线。我必须在 x86 intel linux 单元上使用 AT&T 语法。 我已经走得很远了,但我想知道如何进入 VGA 模式或 Mode-X,以及如何在屏幕上放置一个像素。标准 C 库(如 printf)中是否有此功能?

非常感谢您的帮助。 :)

<pre></pre>

.bss # 声明未初始化的变量

.data # 声明初始化变量

.text # 实际汇编代码和常量

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 # 压入基指针 movl %esp, %ebp # 初始化基指针 pushl $intro # 推送字符串地址 call printf # 从 C 库中调用 printf 例程 添加 $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: #... 仍在努力

    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

画:
调用 putpixel # pushl %ebp # 压入基指针 # movl %esp, %ebp # 初始化基指针 inc %ebx # 增量 X inc %ecx # 增量 Y cmpl $200, %ecx # 检查 Y => 200 jge end # 如果 Y=> 200,跳转到结束 jmp draw # 循环

putpxl: #必须在 (%ebx, %ecx) 放置一个像素并返回绘图 # 应该使用主程序中的颜色

end: movl %ebp, %esp # 移除局部变量 popl %ebp # 删除基指针 ret # 返回主程序

【问题讨论】:

    标签: assembly x86 vga att


    【解决方案1】:

    您可以做的最好的事情是使用更高级别的库,例如 SDL 或 Allegro。这样,您的程序将在 X11 和非 VGA 帧缓冲区(例如:基于 ARM 的嵌入式设备上的显示)上运行。

    Svgalib 允许为 VGA 和所谓的 SVGA 显卡编程。它的开发在几年前就停止了。

    有两种方法可以访问 VGA 硬件:

    • 使用寄存器
    • 使用 VGA BIOS:这是您尝试过的。 VGA BIOS 被编写为在实模式下运行。要从保护模式调用它们,您需要切换到 vm86 模式。这就是 LRMI(Linux 实模式接口,与 DPMI 相反)所做的。

    【讨论】:

    • 谢谢。我会尝试vm86模式。我认为我的任务目标是什么……虽然大师很模糊:(
    • @CurveBall:你确定你需要去VGA吗?也许您的老师希望您使用帧缓冲区?
    • 他特别向我指出了 VGA/Mode-X。这是他给我的参考资料(特别是 VGA/Mode-X):archive.gamedev.net/reference/list.asp?categoryid=130 但那是在 DOS 上,因为 osgx 说 linux 是受保护的操作系统,我想这是不可能的。也许他不知道它在 linux 上不起作用......他问我会使用什么操作系统,我说 Linux,他回答说“这个参考可能也适用于 Linux”......也许我应该联系他告诉他这个问题吗?顺便说一句:非常感谢你们的帮助:)
    【解决方案2】:

    您不能在 linux(受保护的操作系统)中进行直接视频(图形模式)输出。只有在 dos(实模式操作系统)中才有可能。

    您可以使用帧缓冲设备或 SDL,或 libX11。但是没有理由使用 asm 中的高级库。

    Linux 中不允许直接使用 Int 10(在用户模式下;内核必须进行低级访问)。

    例如这是 5 岁的完全相同的讨论 http://www.gamedev.net/topic/368196-linux-assembler-int-10h/

    【讨论】:

    • 非常感谢! :) 所以基本上,你的意思是,如果没有更高级别的库,这在 linux 上是不可能以简单的方式实现的?
    • 是的,如果没有内核的帮助,就无法输出视频或更改视频模式。获得此帮助的最简单方法是使用库。但是您只能使用库来输出预渲染的像素图并使用汇编程序生成像素图。
    猜你喜欢
    • 2014-03-25
    • 1970-01-01
    • 1970-01-01
    • 2021-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-25
    相关资源
    最近更新 更多