【发布时间】:2018-05-29 16:55:51
【问题描述】:
我正在编写一个 IQ 测试生成程序,在该程序中我必须随机生成包括口头非口头问题的问题。为了生成非语言问题,我想显示字母和字母以圆形或三角形出现的问题。
但我不知道如何定位它们。例如,在一个非语言问题中,我想通过编写以下代码将字母和数字定位为三角形:
mov al, alpha
call writechar
add dl, 4
call gotoxy
mov al, num
call writedec
sub dl, 2
add dh, 1
call gotoxy
mov al, alpha
call writechar
这是我已经知道的
dh= 行
dl=列
调用gotoxy
Gotoxy 定位光标相对于控制台的起始位置,而不是相对于当前位置。这是我遇到的问题。
我认为应该有一种获取当前光标位置的方法,以便我可以通过在 dh 和 dl 的当前值中加减来来回定位光标,而连续生成形状。
【问题讨论】:
-
没有众所周知的
gotoxy通用汇编函数,所以你必须使用某种支持库,其中包含这样的函数。检查您使用的是哪种库,以及它的文档(或者它的源代码,如果源代码可用)。也许这是尔湾图书馆? 32位windows变种?然后你可以试试programming.msjc.edu/asm/help/index.html ... Irvine lib中没有读取光标位置的函数,你可以使用底层的windows API调用,或者通过重新设计代码逻辑来完全避免这种需要。 -
如果是 Irvine32 库,那么
gotoxy(以及其他调用,如writedec和writechar)将不会修改dx寄存器中的值,因此您可以继续调整dh/dlall像您发布的类似代码中的时间,它将保留其价值。所有 Irvine lib 调用都保留所有寄存器值,但返回函数值的输出寄存器除外。但是writechar本身可能会将内部控制台光标移动1 个字符,因此下一个writechar不会覆盖前一个(而您的dx不受call write***的影响)。 =不清楚,你在问什么/什么不起作用 -
如果这是关于初始位置,然后设计屏幕,它应该看起来如何......你是否为每个问题重绘整个屏幕?然后您可以准确地设计最初要从哪里开始绘图,您不需要读取旧的光标位置,只需根据需要重新绘制屏幕并将所有内容放在计划的位置上。 (寻找某种“清除屏幕”..我从未使用过 Irvine32,所以我不确定那个控制台的工作原理)继续试验一段时间)
-
是的,我正在使用 irvine32 库
-
您确定它不是 16 位 DOS 版本吗?从您发布的代码来看,这并不明显,因为您只使用 8 位和 16 位寄存器,所以这种代码在两个目标平台上看起来都是一样的,但它对于理解控制台行为可能至关重要,因为 Windows“控制台”是模拟的东西(就像它可以调整到一些奇怪的大小,比如 174x33),而 DOS 具有图形卡支持的硬件文本模式(具有固定大小/等)。