是否可以通过启用A20在实模式下使用4GB内存,而无需切换到保护模式,也不会丢失BIOS中断?
我正在尝试学习汇编并编写引导程序.以下代码将软盘驱动器的内容加载到内存并跳转到它(开始在地址0x1000加载).此代码应该在屏幕上打印"X",但由于某种原因,它会打印一个空格.有人可以告诉我有什么问题吗?
[bits 16]
jmp reset
reset: ;Resets floppy drive
xor ax,ax ;0 = Reset floppy disk
mov dl,0 ;Drive 0 is floppy
int 0x13
jc reset ;If carry flag was set, try again
mov ax,0x1000 ;When we read the sector, we are going to read address 0x1000
mov es,ax ;Set ES with 0x1000
floppy:
mov ah,0x2 ;2 = Read floppy
mov al,0x11 ;Reading one sector
mov ch,0x0 ;Track 1
mov cl,0x2 ;Sector 2, track 1
mov dh,0x0 ;Head 1
mov …Run Code Online (Sandbox Code Playgroud) 在QEMU中诊断引导加载程序代码?
我试图创建一个最小的“引导程序代码”,该代码打印字符“ A”,然后停止。
我为此编写了以下C ++程序
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(int argc, char** argv)
{
/*
* If I run these code directly in Windows, it crashes, for I believe Windows
* do not allow accessing the BIOS directly, that make sense
*
* But I can compile a binary, then I can use the debugger to view what machine code
* does these correspond to, and build to boot program!
*/
/*
__asm
{
mov ah, 0x0e …Run Code Online (Sandbox Code Playgroud) 我知道这段代码实际上会将数据写入ds:[100h]
mov [100h], ax
Run Code Online (Sandbox Code Playgroud)
但是,如何在100H不使用段基的任何段寄存器的情况下直接写入线性地址?
为什么在下面的代码中我们推送代码段(PUSH CS)然后将其弹出到数据段(POP DS)?
我将这些行明确地表示为line1和line2.请告诉我MOVSW如何在这里工作.
IF HIGHMEMORY
PUSH DS
MOV BX, DS
ADD BX, 10H
MOV ES, BX
PUSH CS. ;line1
POP DS. ;line2
XOR SI, SI
MOV DI, SI
MOV CX, OFFSET SYSSIZE + 1
SHR CX, 1
REP MOVSW. ;line3
POP DS
PUSH ES
MOV AX, OFFSET SECONDRELOCATION
PUSH AX
AAA PROC FAR
RET
AAA ENDP
SECONDRELOCATION:
more code here..............
Run Code Online (Sandbox Code Playgroud) how to find a segment address from given data?
Physical address = 0x119B, Effective address = 0x10AB
what could be the formula?
在维基百科中,虚拟8086模式的解释被称为
在80386微处理器及更高版本中,虚拟8086模式(也称为虚拟实模式,V86模式或VM86)允许执行在处理器运行受保护模式操作系统时无法直接以受保护模式运行的实模式应用程序
我认为这意味着虚拟8086模式可以访问系统内存和硬件设备.
并解释实地址模式
实模式,也称为实地址模式,是所有x86兼容CPU的操作模式.实模式的特点是20位分段存储器地址空间(精确到1 MiB的可寻址存储器)和对所有可寻址存储器,I/O地址和外围硬件的无限制直接软件访问.实模式不支持内存保护,多任务处理或代码权限级别
我认为它们之间没有区别.有人知道吗?
我在Barry B. Brey的"THE INTEL MICROPROCESSORS"一书中找到了这个.这是真的吗?但为什么?我知道在实际的8086微处理器的实模式中,没有32位寄存器.那么现在应该对32位寄存器施加同样的限制吗?
今天我使用g ++来编译一个c ++文件,但是g ++似乎有一个问题,当一个char类型的变量与任意数量的char类型比较,并且第7位设置为1时,g ++总是假设它是假的因此使得这些东西错误.更具体地说,c ++代码如下所示:
// test.cpp
__asm__(".code16gcc \n\t");
int equals0(char i)
{
return i==0x80;
}
int equals1(char i)
{
return i==0x10;
}
int equals2(int i)
{
return i==0x80;
}
Run Code Online (Sandbox Code Playgroud)
请注意,有一个前导句".code16gcc",我用它来生成实模式代码.
更具体地说,我的g ++版本是cygwin上的"g ++(GCC)6.4.0".
现在,使用以下命令将此文件编译为汇编代码
g++ -S -o test.s test.cpp -m32
结果文件是:
// some trival information is omitted
.code16gcc
.text
...
__Z7equals0c://func equals0
pushl %ebp
movl %esp, %ebp
subl $4, %esp
movl 8(%ebp), %eax
movb %al, -4(%ebp) //no comparison with 0x80
movl $0, %eax //always returns 0
leave
ret …Run Code Online (Sandbox Code Playgroud) 标题说明问题。但是基本上每次我用MOV指令用一个变量来注册寄存器显示CD。但是当我使用实际数字时,寄存器会显示数字吗?
mov ax, @data 是否意味着将数据段内存地址移动到 ax 寄存器,并且它是否必须专门为 ax 寄存器。或者,如果我想使用 bx 寄存器中的变量,我可以做一些类似 move mov bx, @data 的事情。请回答
为什么我必须做 mov ds, ax ds 做什么为什么我很困惑有人帮助我。