IAPX88 可以处理 1 兆字节内存(20 位寻址),现在我的问题是我们如何使用两个 16 位寄存器来制作 20 位地址。请举例说明。
有人知道如何在不使用其他变量、寄存器、堆栈或任何其他存储位置的情况下交换 2 个寄存器的值吗?谢谢!
就像交换AX,BX。
我用汇编写了一个引导加载程序。下面是它的工作原理:
首先,BIOS 正常加载引导加载程序。指示进入200h。
在 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) 我想确认一些事情.我正在为8086制作汇编语言程序.我正在使用masm611汇编程序进行汇编.如果我在32位窗口的命令提示符下运行并调试8086 16位实模式程序,它是否使用和修改实际的cpu寄存器和内存?该程序是否在Windows 32bit下的虚拟模式下运行?
另外,如果我使用PWB Microsoft Programmers'Workbench中的CodeView调试器调试程序,如下所示:
运行调试程序的8086汇编语言程序http://i65.tinypic.com/35cej2e.jpg
请确认CodeView调试器中的寄存器和存储器值是否为硬件中的实际值并且正在更改.此外,当我在PWB中运行程序时,它使用Windows 32位下的实际硬件.
假设我想在汇编中将一个大数乘以另一个(可能很小)的数。大数(被乘数)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)
所以结果为零!对此有什么想法吗?
自从我开始使用8086汇编语言编程以来,我一直在思考这些段和段寄存器.我面临的问题是,我无法看到我脑海中存在哪些细分的视觉图像,因此这些概念对我来说并不清楚.
问题1:
据我所知,在启用了20地址线的16位实模式下,我们可以将物理内存分成16段,每段64KiB.第一部分开始于0x00000.下一段的起始地址是什么.是否会添加0x10000(65536 = 64KiB)?
问题2:
这个问题有点奇怪,但仍然是我唯一的选择.假设我给了一个偏移地址0x6000,我怎样才能找到它所属的段以便解决它.
谢谢
我对程序集完全陌生,在搜索之后我仍然对寄存器有一些疑问。目前我正在尝试通过执行以下操作一遍又一遍地划分值:
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。
所以我得到了 2 个 8 位数字,我们称它们为a和b。如果前 3 位相同(因此是最重要的那些),我需要汇编程序(带有 16 位寄存器的 emu8086)对它们执行一些操作(我认为如果达到那个点我可以处理)。
我是组装新手,但最直接的解决方案似乎是XOR,因为XOR将为相同的输入提供 0 (0 xor 0 = 0, 1 xor 1 = 0) 和 1 对于不同的输入。
但是我怎么能做到 2 个字节呢?是否可以将它们中的每一个视为一个数组并逐位“比较”它们并将结果存储XOR在其他寄存器中?然后我怎样才能“隔离”这个结果的 3 个最重要的位?
我不知道除法中溢出的确切定义是什么。你能先解释一下,然后通过下面的例子来指导吗?
例如我的书上写过这段代码导致溢出。不知道为什么??
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)
那么为什么第一个结果变成溢出而第二个结果不是有什么区别呢?
我已经读过这样的STOSB函数:
ES:[DI] <-- AL
Run Code Online (Sandbox Code Playgroud)
如果DF = 0增量DI否则递减DI.
STOSB不改变DS:[DI]呢?