标签: x86-16

如何使用两个 16 位寄存器制作 20 位地址?

IAPX88 可以处理 1 兆字节内存(20 位寻址),现在我的问题是我们如何使用两个 16 位寄存器来制作 20 位地址。请举例说明。

assembly real-mode memory-segmentation x86-16

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

用 8086 汇编语言交换 2 个寄存器(16 位)

有人知道如何在不使用其他变量、寄存器、堆栈或任何其他存储位置的情况下交换 2 个寄存器的值吗?谢谢!

就像交换AX,BX。

assembly cpu-registers 16-bit x86-16

1
推荐指数
1
解决办法
2万
查看次数

引导加载程序未加载第二个扇区

我用汇编写了一个引导加载程序。下面是它的工作原理:

  1. 首先,BIOS 正常加载引导加载程序。指示进入200h。

  2. 在 200h 处,有一些代码位于 200h 和 21Eh 之间。它只是切换到 VGA 模式,使用 VGA 功能在坐标 1,1 上绘制一个洋红色像素。它永远循环该代码。

然而,当我加载它时,它只是在闪烁的光标上移动,这是普通的 VGA .bin 文件不会做的,并且会显示一个像素。我检查了一个像素,但什么也没看到。我看到的意思是 VGA 代码没有运行,引导加载程序只是加载了,没有别的。

引导加载程序代码:

 cli
 startload:
 push 0x00000200
 ret

 times 510-($-$$) db 0
 db 0x55
 db 0xAA
Run Code Online (Sandbox Code Playgroud)

您可以看到它只是转到下一个扇区(从 200h 开始)和 200h-21Eh 处的代码:

BITS 16
org 200h
data:
xcoord DB '1'
ycoord DB '1'
color DB 'D'
.code:
vga:
mov ax, 13h
int 10h
mov ax, ycoord
mov bx, xcoord
mov cx, 320
mul cx
add ax, bx
mov di, ax
mov …
Run Code Online (Sandbox Code Playgroud)

assembly bios vga bootloader x86-16

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

16位程序是否在32位操作系统上以虚拟8086模式运行?

我想确认一些事情.我正在为8086制作汇编语言程序.我正在使用masm611汇编程序进行汇编.如果我在32位窗口的命令提示符下运行并调试8086 16位实模式程序,它是否使用和修改实际的cpu寄存器和内存?该程序是否在Windows 32bit下的虚拟模式下运行?

另外,如果我使用PWB Microsoft Programmers'Workbench中的CodeView调试器调试程序,如下所示:

PWB

运行调试程序的8086汇编语言程序http://i65.tinypic.com/35cej2e.jpg

请确认CodeView调试器中的寄存器和存储器值是否为硬件中的实际值并且正在更改.此外,当我在PWB中运行程序时,它使用Windows 32位下的实际硬件.

windows assembly virtual command x86-16

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

16 位 x 32 位的汇编乘法 => 48 位

假设我想在汇编中将一个大数乘以另一个(可能很小)的数。大数(被乘数)DX:AX保存在BX. 该MUL指令仅对 进行操作AX。那么该怎么办DX呢?

例如,数字是0001:0000H(65536),我想将其乘以 2。

number     dw   0000h, 0001h
...
mov    ax, [number]
mov    dx, [number+2]
mov    bx, 2
mul    bx   ; it is ax*2 or 0000*2
Run Code Online (Sandbox Code Playgroud)

所以结果为零!对此有什么想法吗?

assembly bigint extended-precision x86-16

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

什么是细分以及如何在8086模式下解决这些问题?

自从我开始使用8086汇编语言编程以来,我一直在思考这些段和段寄存器.我面临的问题是,我无法看到我脑海中存在哪些细分的视觉图像,因此这些概念对我来说并不清楚.


  • 任何人都可以帮助我理解将其与现实世界场景相关联的概念吗?我还有以下问题:

问题1:

据我所知,在启用了20地址线的16位实模式下,我们可以将物理内存分成16段,每段64KiB.第一部分开始于0x00000.下一段的起始地址是什么.是否会添加0x10000(65536 = 64KiB)?

问题2:

这个问题有点奇怪,但仍然是我唯一的选择.假设我给了一个偏移地址0x6000,我怎样才能找到它所属的段以便解决它.

谢谢

x86 assembly operating-system kernel x86-16

1
推荐指数
2
解决办法
1291
查看次数

汇编将 al 寄存器值移入 ax

我对程序集完全陌生,在搜索之后我仍然对寄存器有一些疑问。目前我正在尝试通过执行以下操作一遍又一遍地划分值:

1.将 ax 与 bl 相除(似乎余数去 ah,商去 al)

2.move al(quotient) to ax

3. 如果 ax 小于或等于 0,则跳转到 5

4.跳到1

5.结束

问题出现在指令 2 上,因为我试图将 8 位值移动到 16 位值。有人知道如何解决问题吗?

我使用的是 emu8086,所以寄存器只有 x、h 和 l。

assembly x86-16 emu8086

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

用汇编语言对 2 个字节进行异或运算

所以我得到了 2 个 8 位数字,我们称它们为ab如果前 3 位相同(因此是最重要的那些),我需要汇编程序(带有 16 位寄存器的 emu8086)对它们执行一些操作(我认为如果达到那个点我可以处理)。

我是组装新手,但最直接的解决方案似乎是XOR,因为XOR将为相同的输入提供 0 (0 xor 0 = 0, 1 xor 1 = 0) 和 1 对于不同的输入。

但是我怎么能做到 2 个字节呢?是否可以将它们中的每一个视为一个数组并逐位“比较”它们并将结果存储XOR在其他寄存器中?然后我怎样才能“隔离”这个结果的 3 个最重要的位?

assembly xor x86-16 emu8086

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

汇编中除法溢出(8086)

我不知道除法中溢出的确切定义是什么。你能先解释一下,然后通过下面的例子来指导吗?

例如我的书上写过这段代码导致溢出。不知道为什么??

mov dx,0087h
mov ax,6002h
mov bx,10h
div bx
Run Code Online (Sandbox Code Playgroud)

但是这段代码是正确的,不会导致溢出:

mov dx,0087h
mov ax,6000h
mov bx,100h
div bx
Run Code Online (Sandbox Code Playgroud)

那么为什么第一个结果变成溢出而第二个结果不是有什么区别呢?

assembly x86-16

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

STOSB是否有使用额外段的特殊原因?

我已经读过这样的STOSB函数:

ES:[DI] <-- AL
Run Code Online (Sandbox Code Playgroud)

如果DF = 0增量DI否则递减DI.

  • 那么为什么STOSB不改变DS:[DI]呢?
  • 是否有使用额外细分的特殊目的?
  • 在大多数字符串指令中,我们使用额外段 为什么?

assembly memory-segmentation x86-16

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