Assembly 如何根据坐标读取控制台上已经存在的位置?组件8086

Assembly 如何根据坐标读取控制台上已经存在的位置?组件8086,assembly,x86,x86-16,Assembly,X86,X86 16,我正在制作一个吃豆人游戏,我需要检查我角色前面的坐标中有什么,这样我就可以看到吃豆人是否有可能移动到这些坐标中。我已经搜索了很多次了,但我不确定如何准确地将这个问题转化为谷歌搜索的术语,而且运气不好 我想做的事情的伪代码: CheckNext PROC go to coordinate position (champ_xnew,champ_ynew) take what is in that position, store into next (next BYTE ?) 检查下一个进程 转到

我正在制作一个吃豆人游戏,我需要检查我角色前面的坐标中有什么,这样我就可以看到吃豆人是否有可能移动到这些坐标中。我已经搜索了很多次了,但我不确定如何准确地将这个问题转化为谷歌搜索的术语,而且运气不好

我想做的事情的伪代码:

CheckNext PROC go to coordinate position (champ_xnew,champ_ynew) take what is in that position, store into next (next BYTE ?) 检查下一个进程 转到坐标位置(champ_xnew,champ_ynew) 获取该位置的内容,存储到下一个(下一个字节?) 上面的部分(从记忆中阅读)是我需要帮助的

cmp next, '#' ;# is what I am using for walls je NoMove jne Move Move: champ_x = champ_xnew champ_y = champ_ynew NoMove: return without changing champ_x/y CheckNext ENDP cmp下一步,###这是我用来做墙壁的 我不喜欢 jne移动 移动: champ_x=champ_x新 champ_y=champ_ynew NoMove: 返回而不更改champ_x/y 检查下一个端点
只要屏幕处于文本模式(而不是图形模式),您可以简单地从(分段)地址0xB800:0x0000读回屏幕数据。

假设您使用的是彩色文本模式,那么您的屏幕从B800:0000开始,您使用的是8086操作码,即在有效地址计算中不进行缩放。一行有160个字节(每个字符单元填充两个字节:一个用于字符本身,另一个用于颜色)


要读取屏幕上特定坐标上的字符和颜色,有两种方法:

  • 使用int 10h的功能08h
  • 输入:

    ah=08h bh=屏幕页面数(我总是使用0)

    输出:

    al=字符 ah=颜色(上4位和下4位为前景色和背景色)

    要查找屏幕页的编号,请使用int 10h的功能0fh

    输出:

    当前视频模式 ah:每行的COL数 BH:当前屏幕页的数目

    如果在windows控制台上使用int 10h的功能0fh,如果控制台

    不是全屏模式

  • 直接访问视频存储器:
  • 使用“mov ax,0b800h mov es,ax”将ds寄存器设置为0b800h

    将si设置为字符的偏移量(NumberOfScreenpage*(cols*行*2)+2*(行*cols+col))

    使用lodsw加载单词

    啊,现在有颜色了
    al包含字符

    屏幕不是信息的存储器,而是一个输出设备。虽然可以从视频存储器中读取字符/像素,但这是不可取的。将级别的结构存储在内存中。然后随意读(写)@SevaAlekseyev如果我没记错的话,至少在某些VGA模式下,视频内存可以用来保存由几个位平面组成的精灵,以便以后复制到视频内存的可见区域,这是迈克尔·艾布拉什在《图形编程之禅》第二版中提到的一种技术。无论如何,我同意你的观点,一般来说,屏幕或视频存储器不应该被程序读取,只能直接或间接地写入。这不是OP的目的。所述技术用于图形性能,而不是(mis)使用视频存储器进行状态存储。不管怎样,它的效率非常低,有位平面之类的。
    mov al,[x]
    mov bl,160
    mul bl           ;AX = x*80*2
    xor bx,bx
    mov bl,[y]
    add bx,bx        ;BX = y*2
    add ax,bx        ;AX = x*160 + y*2
    mov si,ax
    mov ax,0b800h
    mov es,ax        ;ES:SI points to the character at coordinates X,Y
    mov al,es:[si]   ;AL has the ASCII code of character at coordinates X,Y