如何在 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 信息? 的相关文章

  • 让 GCC/Clang 使用 CMOV

    我有一个简单的标记值联合 这些值可以是int64 ts or doubles 我正在对这些联合进行加法 但需要注意的是 如果两个参数都代表int64 t值 那么结果也应该有一个int64 t value 这是代码 include
  • 使用`esp*scale 时寻址内存时出错

    内存寻址一般形式 发现了here https stuff mit edu afs athena project rhel doc OldFiles 3 rhel as en 3 i386 memory html is base index
  • C 结构如何返回[重复]

    这个问题在这里已经有答案了 我想知道如何返回一个结构 例如 typedef struct number uint64 t a b c d number number get number number res 0 0 0 0 return
  • MAC-1 汇编递归

    如何在 MAC 1 汇编器中调用递归函数 在 C 中你会做类似的事情 int func int num if num 0 return 1 return num func num 1 我知道如何使用调用函数 CALL 以及如何将参数加载到堆
  • 如何让 gcc 生成合适的代码来检查缓冲区是否充满 NUL 字节?

    我正在实现一个解析磁带档案的程序 解析器逻辑的一部分是检查存档结束标记 该标记是一个充满 NUL 字节的 512 字节块 我为此编写了以下代码 希望 gcc 能对此进行很好的优化 int is eof block const char us
  • 如何创建具有倾斜效果的 NSAffineTransform?

    我对用 Cocoa 绘图还很陌生 并且正在开发一个涉及六边形网格的实验性应用程序 为了简化这个过程 我想倾斜坐标系 使 Y 轴向左旋转 30 度 我在苹果手机上看到了这个可可绘图指南 https developer apple com li
  • 添加饱和 32 位有符号整数内在函数?

    有人可以推荐一种使用 Intel 内在函数 AVX SSE4 添加饱和 32 位有符号整数的快速方法吗 我查看了内在指南并发现 mm256 adds epi16但这似乎只添加 16 位整数 我没有看到 32 位有任何类似的东西 其他电话似乎
  • 学习 SVG 的书籍/教程 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 用于计算三角函数、对数或类似函数的算法。仅限加减法

    我正在修复 Ascota 170 古董机械可编程计算机 它已经开始工作了 现在我正在寻找一种算法来展示其功能 例如计算三角或对数表 或类似的东西 不幸的是 从数学运算来看 计算机只能进行整数的加减法 从 1E12到1E12的55个寄存器 甚
  • 段错误...关于你好世界

    这段代码非常简单 但我在 x86 64 Linux 系统上遇到了段错误 这让我很烦恼 刚开始接触asm 请耐心等待 与 NASM 组装nasm f elf64 test asm 与连接ld o test test o SECTION tex
  • 如果没有按下任何键,则检查按键而不阻塞

    我正在创建一个应用程序来查看当前时间 并创建了一个循环来每秒更新时间 循环看起来像这样 UPDATE The code to be re executed JMP UPDATE 但我无法结束它 当我使用 MOV AH 00H INT 21H
  • x11/xlib 与 Microsoft Visual C++

    我从维基百科复制粘贴这段代码 http en wikipedia org wiki Xlib http en wikipedia org wiki Xlib 我收到此错误 fatal error C1083 Cannot open incl
  • 无需画布,用纯 JS 生成图像

    如何在没有画布的情况下用纯 JavaScript 无外部库 从像素数组生成 绘制图片 我尝试以URI形式生成图像但没有成功 图片格式不容易快速理解和实现 BMP 数据URI 您可以使用以下函数生成 BMP 位图 dataURI 24 位的
  • 段寄存器如何参与内存地址转换?

    到目前为止我所学到的有关细分的知识 虚拟地址包含段选择器和偏移量 段选择器与GDTR配合使用 查找段描述符的线性地址 段描述符保存有关所选段的信息 包括其线性地址 所以 我的问题是 根据我所读到的内容 虚拟地址被加载到段寄存器中 然后以某种
  • 如何在 MOS 6502 的 asm 中创建延迟

    我是 ASM 新手 我正在尝试研究如何为以下代码创建延迟 org 1000 loop inc d021 jmp loop 我想评论已经足够清楚了 每帧更改颜色的代码示例 1 50 秒 sei enable interrupts loop1
  • 该程序如何知道该字符串存储的确切位置?

    我用 Radare2 反汇编了一个 C 程序 在这个程序中有很多调用scanf像下面这样 0x000011fe 488d4594 lea rax var 6ch 0x00001202 4889c6 mov rsi rax 0x0000120
  • 计算 [1..N] 中前导 1 下面有 K 个零位的整数? (没有 HW POPCNT 的连续范围的 popcount)

    I have following task Count how many numbers between 1 and N will have exactly K zero non leading bits e g 710 1112 will
  • Java制作一条有向线并使其移动

    我想画一条有向线并让它移动 我能够绘制一条有向线并移动该线 但当我移动该线时箭头会移位 这是我的绘画方法 Line2D Double line new Line2D Double startX startY endX endY g2d dr
  • x86 中有加速 SHA (SHA1/2/256/512) 编码的指令吗?

    一个例子 在x86 是硬件加速 AES 的指令集 http en wikipedia org wiki AES instruction set 但是x86中是否有加速SHA SHA1 2 256 512 编码的指令 以及在x86上编码SHA
  • 调用 printf 系统子例程在汇编代码中输出整数错误[重复]

    这个问题在这里已经有答案了 来回 在windows7控制台窗口中运行gcc s2 asm 然后生成一个exe文件 运行a exe 然后崩溃 为什么 s2 asm 代码由以下源代码生成 int m m 1 iprint m s2 asm请参考

随机推荐