标签: real-mode

在实模式下访问4GB RAM

是否可以通过启用A20在实模式下使用4GB内存,而无需切换到保护模式,也不会丢失BIOS中断?

x86 assembly real-mode

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

引导程序的第二阶段使用Int 0x10/ah = 0x0e打印垃圾

我正在尝试学习汇编并编写引导程序.以下代码将软盘驱动器的内容加载到内存并跳转到它(开始在地址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)

x86 assembly real-mode nasm bootloader

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

在QEMU中诊断引导加载程序代码?

在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)

assembly real-mode bootloader visual-c++ x86-16

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

写入地址而不使用段寄存器

我知道这段代码实际上会将数据写入ds:[100h]

mov [100h], ax
Run Code Online (Sandbox Code Playgroud)

但是,如何在100H不使用段基的任何段寄存器的情况下直接写入线性地址?

x86 assembly real-mode nasm x86-16

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

在REP MOVSW之前,PUSH CS/POP DS的目的是什么?

为什么在下面的代码中我们推送代码段(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)

assembly real-mode x86-16

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

Find Segment address from given physical and effective address

how to find a segment address from given data?

Physical address = 0x119B, Effective address = 0x10AB

what could be the formula?

assembly real-mode memory-segmentation x86-16

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

x86处理器中Virtual-8086模式和实地址模式有什么区别

在维基百科中,虚拟8086模式的解释被称为

在80386微处理器及更高版本中,虚拟8086模式(也称为虚拟实模式,V86模式或VM86)允许执行在处理器运行受保护模式操作系统时无法直接以受保护模式运行的实模式应用程序

我认为这意味着虚拟8086模式可以访问系统内存和硬件设备.

并解释实地址模式

实模式,也称为实地址模式,是所有x86兼容CPU的操作模式.实模式的特点是20位分段存储器地址空间(精确到1 MiB的可寻址存储器)和对所有可寻址存储器,I/O地址和外围硬件的无限制直接软件访问.实模式不支持内存保护,多任务处理或代码权限级别

我认为它们之间没有区别.有人知道吗?

x86 assembly real-mode

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

在实模式下使用32位寄存器寻址存储器时,寄存器的内容不得超过0000FFFFH.为什么?

我在Barry B. Brey的"THE INTEL MICROPROCESSORS"一书中找到了这个.这是真的吗?但为什么?我知道在实际的8086微处理器的实模式中,没有32位寄存器.那么现在应该对32位寄存器施加同样的限制吗?

x86 assembly intel real-mode

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

G ++生成逻辑上错误的汇编代码

今天我使用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)

c++ g++ real-mode

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

x86 为什么我在移动变量时总是在 al 寄存器中获取 CD

标题说明问题。但是基本上每次我用MOV指令用一个变量来注册寄存器显示CD。但是当我使用实际数字时,寄存器会显示数字吗?

在此处输入图片说明

mov ax, @data 是否意味着将数据段内存地址移动到 ax 寄存器,并且它是否必须专门为 ax 寄存器。或者,如果我想使用 bx 寄存器中的变量,我可以做一些类似 move mov bx, @data 的事情。请回答

为什么我必须做 mov ds, ax ds 做什么为什么我很困惑有人帮助我。

x86 dos real-mode x86-16 emu8086

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