标签: x86-16

典型的贪吃蛇游戏。如何追踪蛇的踪迹?

这个棋盘游戏的目标是吃掉食物并成长。

在最基本的形式中,游戏仅使用 3 种颜色:一种用于蛇(一系列互连的图块),一种用于食物(随机选择的图块),一种用于背景(未占用的图块)。因为蛇是不断移动的,所以任何时候蛇头在哪里都会很明显。不需要任何图形标记。玩家可以通过键盘上的方向键控制蛇,瞄准食物。如果食物被吃掉,蛇会额外长出一段,并且接下来的食物会被放置在棋盘上。如果蛇撞到边界或撞到自己,游戏就结束了!

为了使蛇移动,在“头”侧添加一个新段,并在“尾”侧删除现有段。在程序中,我们可以将“头”和“尾”的坐标存储在变量中。更新“head”变量很容易,但是我们如何才能明确地知道新的“tail”在哪里呢?那么,我们该如何追踪蛇呢?是否有必要发明一些数据结构?

windows assembly dos x86-16

0
推荐指数
1
解决办法
444
查看次数

无法理解堆栈段寄存器

段寄存器用于将可寻址存储器的范围从 64K 字节增加到 1M 字节。但是,我很难理解堆栈段寄存器(SS),因为堆栈已经有两个与之关联的其他寄存器:spbp

假设我将SS设置为5000h ,然后决定通过初始化bpsp寄存器来初始化堆栈。最初堆栈应该是空的。因此,spbp最初应该具有相同的内容。我可以使用任何随机地址初始化sp吗?或者我会有一些限制吗?

例如,用地址7000h初始化sp可以吗

assembly bootloader memory-segmentation x86-16 stack-pointer

0
推荐指数
1
解决办法
1172
查看次数

为什么我的汇编子例程被调用,即使我没有在引导加载程序的 _start 中调用它

我目前正在开发一个 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)

assembly nasm bootloader x86-16

0
推荐指数
1
解决办法
66
查看次数

对堆栈中值的地址感到困惑

下面是一些工作 - 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 …

x86 assembly x86-16

0
推荐指数
1
解决办法
218
查看次数

汇编语言8086

我对Assembly 8086有一个问题.我不知道如何使用2D数组.当我这样使用时, mov ar[cx][dx]我得到一个错误,当我想要我们SIDI数组时,它也会返回错误.

assembly x86-16

-1
推荐指数
1
解决办法
3283
查看次数

在 8086 上将两个 32 位数字相乘得到一个 64 位数字(32x32 => 64 位与 16 位相乘)

我如何将汇编中的两个 32 位数字或一个 32 位与另一个 16 位相乘,有人知道算法吗?

data1 dw 32bit
data2 dw 32bit    
mov ax,data2
Mul data1
Run Code Online (Sandbox Code Playgroud)

assembly multiplication bigint x86-16

-1
推荐指数
1
解决办法
2602
查看次数

有人在x86处理器上有关于16位DOS/BIOS软件中断的书或链接吗?

任何人都可以推荐一本书或提供描述x86-16汇编语言软件中断的Web引用吗?

例如,

mov ah,1
int 21h
Run Code Online (Sandbox Code Playgroud)

读一个字符.

assembly dos bios x86-16

-1
推荐指数
1
解决办法
102
查看次数

在数字之前0x表示什么?

有谁知道为什么人们在数字之前使用0x?

例如:

mov ah, 0x16

mov ah, 16
Run Code Online (Sandbox Code Playgroud)

它们之间有区别吗?

assembly x86-16

-1
推荐指数
1
解决办法
1833
查看次数

16位汇编:无法解析某些寄存器

我正在尝试以下Intel 16位指令:

mov si, word [reg]

在哪里reg注册.如果regbx,它编译好,但是当它是ax,cx或者dx.我正在使用NASM作为我的汇编程序.我确定这是由于指令集中的一些限制.有人可以解释其背后的限制和理由吗?

assembly x86-16

-1
推荐指数
1
解决办法
59
查看次数

如何用鼠标移动光标?

我正在x86汇编中开发一个实模式操作系统。我设法用键盘移动了光标,但我想用鼠标移动了光标。我不知道 我发现int 33h处理鼠标,但是我似乎无法使用int 33h移动光标。

assembly operating-system osdev bootloader x86-16

-1
推荐指数
1
解决办法
167
查看次数