这个棋盘游戏的目标是吃掉食物并成长。
在最基本的形式中,游戏仅使用 3 种颜色:一种用于蛇(一系列互连的图块),一种用于食物(随机选择的图块),一种用于背景(未占用的图块)。因为蛇是不断移动的,所以任何时候蛇头在哪里都会很明显。不需要任何图形标记。玩家可以通过键盘上的方向键控制蛇,瞄准食物。如果食物被吃掉,蛇会额外长出一段,并且接下来的食物会被放置在棋盘上。如果蛇撞到边界或撞到自己,游戏就结束了!
为了使蛇移动,在“头”侧添加一个新段,并在“尾”侧删除现有段。在程序中,我们可以将“头”和“尾”的坐标存储在变量中。更新“head”变量很容易,但是我们如何才能明确地知道新的“tail”在哪里呢?那么,我们该如何追踪蛇呢?是否有必要发明一些数据结构?
段寄存器用于将可寻址存储器的范围从 64K 字节增加到 1M 字节。但是,我很难理解堆栈段寄存器(SS),因为堆栈已经有两个与之关联的其他寄存器:sp和bp。
假设我将SS设置为5000h ,然后决定通过初始化bp和sp寄存器来初始化堆栈。最初堆栈应该是空的。因此,sp和bp最初应该具有相同的内容。我可以使用任何随机地址初始化sp吗?或者我会有一些限制吗?
例如,用地址7000h初始化sp可以吗
assembly bootloader memory-segmentation x86-16 stack-pointer
我目前正在开发一个 BIOS 引导加载程序,我对汇编比较陌生,我一直在阅读它,我了解它是如何工作的,但有一些事情我不明白,涉及我的汇编代码的执行顺序。
所以基本上我的子例程 _print 是如何被调用的,即使我没有调用它。其次,如果BIOS幻数一直在文件末尾,即使我没有到达,它是如何分配的。
我将不胜感激任何帮助,谢谢。
[ORG 0000:7C00]
global _start
_print:
mov ah, 0x0e
mov al, '['
int 0x10
mov al, '+'
int 0x10
mov al, '['
int 0x10
ret
_start:
jmp $
times 510 - ($-$$) db 0
dw 0xAA55
Run Code Online (Sandbox Code Playgroud) 下面是一些工作 - 16 位 x86 程序集
global _start
section .text
_start: mov ah, 0x0e
mov bp, 0x8000
mov sp, bp
push "A"
push "B"
push "C"
pop bx
mov al, bl
int 0x10
pop bx
mov al, bl
int 0x10
mov al, [0x7ffe]
int 0x10
jmp $
times 510 -( $ - $$ ) db 0
dw 0 xaa55
Run Code Online (Sandbox Code Playgroud)
我将 3 个值压入堆栈,然后打印前 2 个值。我试图通过间接寻址打印第三个值,因此 mov al, [0x7ffe] - 但问题是,因为堆栈的基数为 0x8000 并且只能弹出 16 位值,要打印的最后一个字符的地址不是,-“a”是 0x8000 - 0x1 = 0x7FFF 而不是 0x8000 …
我对Assembly 8086有一个问题.我不知道如何使用2D数组.当我这样使用时,
mov ar[cx][dx]我得到一个错误,当我想要我们SI和DI数组时,它也会返回错误.
我如何将汇编中的两个 32 位数字或一个 32 位与另一个 16 位相乘,有人知道算法吗?
data1 dw 32bit
data2 dw 32bit
mov ax,data2
Mul data1
Run Code Online (Sandbox Code Playgroud) 任何人都可以推荐一本书或提供描述x86-16汇编语言软件中断的Web引用吗?
例如,
mov ah,1
int 21h
Run Code Online (Sandbox Code Playgroud)
读一个字符.
我正在尝试以下Intel 16位指令:
mov si, word [reg]
在哪里reg注册.如果reg是bx,它编译好,但是当它是ax,cx或者dx.我正在使用NASM作为我的汇编程序.我确定这是由于指令集中的一些限制.有人可以解释其背后的限制和理由吗?
我正在x86汇编中开发一个实模式操作系统。我设法用键盘移动了光标,但我想用鼠标移动了光标。我不知道 我发现int 33h处理鼠标,但是我似乎无法使用int 33h移动光标。