如何在 tasm 中在屏幕上打印 SVGA 信息?

2023-11-29

我是组装和图形的初学者,任何帮助将不胜感激。我得到了 svga 信息,但是当我打印它时,它不会打印任何内容。如果有人能解释为什么那就太好了。这是代码。如果我所做的事情需要更多解释,请告诉我

.MODEL SMALL
.STACK 64
.DATA
getinfo:
 VbeSignature       db  'VESA'   ; VESA
 VbeVersion         dw  0000h    ; Version
 OemStringPtr       dd  ?        ; Producer
 Capabilities       db  4 dup (?); Reserved
 VideoModePtr       dd  ?        ; Modes
 TotalMemory        dw  ?        ; Blocks
 OemSoftwareRev     dw  ?
 OemVendorNamePtr   dd  ?
 OemProductNamePtr  dd  ?
 OemProductRevPtr   dd  ?
 _Reserved_         db 222 dup (?)
 OemData            db 256 dup (?)

.CODE

Entry:

mov ax, @data   ;make DS point to our DATA ;segment
mov es, ax

mov ax, offset getinfo
mov es, ax
mov ax, 4f00h ;this is the call to read the svga info, and im assuming it is 
               ;stored in getinfo
mov di, offset getinfo
int 10h

xor bx, bx ;make bx zero
mov si, offset getinfo 

loopy:
    mov dl, [si + bx] ;dl is the char to print
    cmp dl, 24h
    je done
    push dx ;before calling print put all the arguments on the stack
    call print
    inc bx          ;point to next char   
    jmp loopy       ;loop if string not finished

jmp done

print:
    pop cx ;take the return address out of the stack
    pop dx ;take the character to print out of the stack
     mov ah, 02h 
        int 21h         ;ask DOS to output a single char
     jmp cx ;jump back to the return address

done:
    mov ax, 4c00h
    int 21h         ;DOS exit program with al = exit code

END Entry

正如人们在评论中建议的那样,您的代码存在一些问题。

首先你错过了getinfo存储数据的结构我挖掘了一些使用 SVGA 的旧代码并发现了这个结构(我假设这不是 VESA 2.0)

getinfo:
 VbeSignature       db  'VESA'   ; VESA
 VbeVersion         dw  0000h    ; Version
 OemStringPtr       dd  ?        ; Producer
 Capabilities       db  4 dup (?); Reserved
 VideoModePtr       dd  ?        ; Modes
 TotalMemory        dw  ?        ; Blocks
 OemSoftwareRev     dw  ?
 OemVendorNamePtr   dd  ?
 OemProductNamePtr  dd  ?
 OemProductRevPtr   dd  ?
 _Reserved_         db 222 dup (?)
 OemData            db 256 dup (?)

因此,您需要添加该内容并修复尝试将偏移量添加到该结构的错误dl。应该放入DI正如玛格丽特·布鲁姆建议的那样。这也是不正确的

mov ax, offset getinfo
mov es, ax

因为你想把数据段放到es不是结构的偏移量。所以代替这个

mov ax, @data
mov es, ax

我不确定 TASM 是否理解这个 @data 表示法。

至于您的打印例程,不确定要打印什么,因为结构中的数据将是二进制的,首先您需要将它们转换为某种可打印的形式(除了 VESA 字符串)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 tasm 中在屏幕上打印 SVGA 信息? 的相关文章

  • C# 窗口形式的漂亮图形

    我需要使用 C 在 Windows 窗体中创建一些简单的图形 简单地说 我指的是线条 圆圈等 但是 当我画画时 例如实心圆 边缘不平滑 正如使用方形像素绘制圆时所预期的那样 但是当在矢量程序中使用相同数量的像素绘制相同的圆时 它看起来很完美
  • 这段汇编语言代码是什么意思?

    我是一名学生 刚刚开始学习汇编语言 为了更好地理解它 我只是用 C 写了一个简短的代码并将其转换为汇编语言 奇怪的是我有点听不懂 代码是 include
  • 为什么我的 FPS 相机一劳永逸地滚动?

    如果我忽略四元数代数的肮脏细节 我想我理解了旋转和平移变换背后的数学 但仍然不明白我做错了什么 为什么我的相机一劳永逸地滚动 更具体地说 我应该如何从相机的方向 旋转矩阵 计算相机视图矩阵 我正在用 Python 编写一个简约的 3d 引擎
  • 如何在汇编语言中换行打印多个字符串

    我试图在汇编中的不同行上打印多个字符串 但使用我的代码 它只打印最后一个字符串 我对汇编语言非常陌生 所以请耐心等待 section text global start start mov edx len mov edx len1 mov
  • CALL指令是否总是将EIP指向的地址压入堆栈?

    x86架构中函数调用时是否存在返回地址不入栈的情况 No CALL根据定义 将在跳转到目标地址之前将返回地址压入堆栈 该返回地址是EIP or RIP sizeof call instruction 通常为 5 个字节 英特尔 64 和 I
  • 汇编基础知识:输出寄存器值

    我刚刚开始学习汇编语言 我已经陷入了 在屏幕上显示存储在寄存器中的十进制值 的部分 我使用 emu8086 任何帮助将不胜感激 model small Specifies the memory model used for program
  • 如何正确实现TBitmap的扫描线访问?

    我正在尝试根据以下方式访问位图的扫描线关于内河码头的文章 http edn embarcadero com article 29173 使用像这样的扫描线 for y 0 to n do begin line bitmap scanline
  • 在linux x86平台上学习ARM所需的工具[关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我有一个 x86 linux 机器 在阅读一些关于 ARM 的各种信息时 我很好奇 现在我想花一些时间学
  • 为什么 RISC-V S-B 和 U-J 指令类型以这种方式编码?

    我正在读一本书 计算机组织与设计RISC V版 我遇到了 S B 和 U J 指令类型的编码 我上面提到的那些类型有奇怪的编码立即字段 S B 类型将直接字段分为两部分 这是有道理的 因为所有指令编码都必须相似 但我无法理解为什么立即字段以
  • 从汇编程序获取命令行参数

    通读 专业汇编语言书籍 似乎它提供了用于读取命令行参数的错误代码 我纠正了一点 现在它从段错误变成了读取参数计数 然后是段错误 这是完整的代码 data output1 asciz There are d params n output2
  • 在 x86-64 CPU 上通过交叉修改代码重现意外行为

    Question 对于可能在 x86 或 x86 x64 系统上触发意外行为的交叉修改代码有哪些想法 在这些系统中 交叉修改代码中的所有操作均已正确完成 但在执行处理器之前执行序列化指令除外修改代码 如下所述 我有一个 Core 2 Duo
  • 汇编8086监听键盘中断

    我有与此完全相同的问题 边画边听键盘 https stackoverflow com questions 13970325 8086 listen to keyboard while drawing 但第一个答案 接受的答案 只听键盘一次
  • “rep stos”x86 汇编指令序列有什么作用?

    我最近偶然发现了以下汇编指令序列 rep stos dword ptr edi For ecx重复 存储内容eax到哪里edi指向 递增或递减edi 取决于方向标志 每次 4 个字节 通常 这用于memset型操作 通常 该指令简单地写成r
  • 如何知道寄存器是否是“通用寄存器”?

    我试图了解寄存器必须具备什么标准才能被称为 通用寄存器 我相信通用寄存器是一个可以用于任何用途的寄存器 用于计算 将数据移入 移出等 并且是一个没有特殊用途的寄存器 现在我读到了ESP寄存器是通用寄存器 我猜是ESP寄存器可以用于任何事情
  • 使用 (float&)int 进行类型双关可以正常工作,(float const&)int 会像 (float)int 一样转换吗?

    VS2019 发布 x86 template
  • ARMv8 A64 汇编中立即值的范围

    我的理解是 ARMv8 A64 汇编中的立即参数可以是 12 位长 如果是这样的话 为什么这行汇编代码是 AND X12 X10 0xFEF 产生此错误 使用 gcc 编译时 Error immediate out of range at
  • 从 exe 文件中获取汇编级代码?

    我当时正在做linux汇编编程 在过去的几天里我已经转而学习windows汇编编程 我在用ml作为我的汇编器和golink作为我的链接器 我有我的汇编代码并已获得我的exe从中 现在我需要取回它的十六进制 xff xab x55等等 在li
  • 程序集比较标志理解

    我正在努力理解汇编程序中的以下代码片段 if EAX gt 5 EBX 1 else EBX 2 在汇编程序中 可以写如下 根据我的书 模拟jge操作说明 https www felixcloutier com x86 jcc您通常会使用
  • Linux内核页表更新

    在linux x86 中分页 每个进程都有它自己的页面目录 页表遍历从 CR3 指向的页目录开始 每个进程共享内核页目录内容 假设三个句子是正确的 假设某个进程进入内核 模式并更新他的内核页目录内容 地址映射 访问 权利等 问题 由于内核地
  • CPU寄存器和多任务处理

    我目前正在学习汇编 我很困惑 CPU 寄存器如何与多任务一起工作 所以在多任务系统中 CPU可以随时暂停某个程序的执行并运行另一个程序 那么在这一步中寄存器值是如何保存的呢 寄存器是压入堆栈还是以其他方式 CPU 寄存器如何与多任务一起工作

随机推荐