标签: real-mode

冒号是什么意思:x86汇编GAS语法在%ds :(%bx)中是什么意思?

我是x86程序集的新手,我正在尝试理解本文档中的代码:http://www.cs.cmu.edu/~410-s07/p4/p4-boot.pdf第3页:

movw $0x1234, %ax
movw %ax, %ds
movw $0x5678, %bx
# The following instruction is the same as "movw $0x1337, (%bx)".
movw $0x1337, %ds:(%bx) # Places 0x1337 into memory word 0x179b8.
# Segment Base: %ds << 4: 12340
# Offset: %bx: + 5678
# -------
# Linear Address: 179b8
Run Code Online (Sandbox Code Playgroud)

但我不理解这个命令:

movw $0x1337, %ds:(%bx) # Places 0x1337 into memory word 0x179b8.
Run Code Online (Sandbox Code Playgroud)

为什么将%ds与(%bx)连接与((%ds << 4)|%bx)相同?

由于我处于实模式(16位),串联不应该是%ds << 8?而不是%ds << 4

为什么括号只是%bx左右?而不是整个结构,如:movw $ 0x1337,(%ds:%bx)?

syntax x86 assembly real-mode gnu-assembler

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

在8086实模式下可以使用哪些中断?

我已经阅读了关于BIOS中断的信息,并且知道它们只能在8086实模式下访问.

我的问题:

  • 还有其他中断吗?我已经阅读过关于DOS中断的内容,但我很困惑,如果它们在实模式下也可用,以及DOS中断列表是什么.

  • 进入保护模式后,存储在0x00的BIOS中断表会发生什么?是替换,还是存在但只是无法访问?

  • BIOS中断如0x13或0x19,它们是如何实现的?它是在软件中还是通过处理器?

assembly operating-system interrupt real-mode x86-16

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

TASM程序输出垃圾,可能会在退出时挂起

我有以下代码,它采用十六进制格式的数字并打印出其十进制格式.

这个程序在Turbo Debugger中运行得很好,但是当我在DOS下运行它时,在输出数字后输出中会看到一些额外的符号:

.model small
.stack 100h
.486
.code

save proc
    itm:
        xor dx,dx
        mov bx,10
        div bx
        add dl,30h
        inc cx
        pop bx
        push dx
        push bx
        cmp ax,0
        jne itm
   ret
save endp

start:
    mov ax, 0FFFFh
    call save
    mov ah, 02
    print:
        pop dx
        int 21h
        loop print
       int 20h
end start
Run Code Online (Sandbox Code Playgroud)

输出:

C:\TASM>lab31 65535 ò ???  9°????UWSîÄPA÷0ó?????ê$?ó????ê$ó??ê?ë?ó???sÄ÷?t? ? ÷??8sê¬ê²?&mî??????÷ t<sÿ????I?>?b!??4&Gê&_ë?î?[?é? z?? ?\?? ?f?[?3¡ïA1èG????uè ç???é????ëX?????Y^?Z? ?tÇ5????á???? ? ??! C?(A?1?:?ÿ?ƒ??[%??C???? 1357                46$??

如你所见,65535打印正常,但随后出现垃圾.当我在Turbo Debugger中运行程序时,它在写出65535之后挂起.

assembly dos real-mode tasm x86-16

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

(程序集x86实模式)程序结束时数据“中断”了吗?

这是(nasm x86实模式)的后续工作,如何在引导加载的扇区中写入/读取字符串?

我正在为NASM中的x86实模式开发玩具OS。512B引导扇区将其余代码加载到另一个扇区。问题是程序结束时我似乎空间不足。

这是源文件的开头:

;;; nasm -f bin -o boot.bin os.asm
;;; qemu-system-x86_64 boot.bin

    bits 16

    section boot, vstart=0x0000

    ;; Load next sector.
    ;; adapted from:
    ;; https://blog.benjojo.co.uk/post/interactive-x86-bootloader-tutorial
    mov ah, 0x02
    mov al, 1   
    mov ch, 0    
    mov cl, 2    
    mov dh, 0   
    mov bx, newsector 
    mov es, bx  
    xor bx, bx
    int 0x13
    jmp newsector:0

    newsector equ 0x0500

    times 510-($-$$) db 0
    db 0x55
    db 0xaa

    section os, vstart=0x0000
    mov ax, newsector
    mov ds, ax …
Run Code Online (Sandbox Code Playgroud)

x86 assembly operating-system real-mode nasm

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

x86_32 虚拟 8086 和实模式是否支持扩展通用和专用寄存器?

是否可以在 x86_32 虚拟 8086 或实模式下使用EAX, EBX,... ?我知道,这些寄存器具有32位(和,即当然它们的非扩展部分是16个比特宽)的尺寸,但并不在类解释的,在该模式中可以使用它们,只有FSGS是仅在保护模式下允许。

x86 assembly real-mode cpu-registers x86-16

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

x86实模式调用不保存返回地址

我正在尝试编写一个实模式引导加载程序,但我目前在尝试启用 A20 线时遇到了问题。到目前为止,这是我的代码,我正在使用 NASM 进行组装:

[bits 16]

[global _start]

jmp _start

bios_print:
 lodsb
 test al, al
 jz bios_print_done
 mov ah, 0x0E
 mov bh, 0
 int 0x10
 jmp bios_print

bios_print_done:
 ret

a20_is_enabled:
 push ds
 push si
 push es
 push di

 xor ax, ax
 mov ds, ax
 mov si, BOOT_ID_OFFS

 mov ax, BOOT_ID_OFFS_PLUS_1MB_SEGM
 mov es, ax
 mov di, BOOT_ID_OFFS_PLUS_1MB_OFFS

 cmp word [es:di], BOOT_ID

 mov ax, 1
 jne a20_is_enabled_done

 mov ax, word [ds:si]
 xor ax, ax
 mov [ds:si], ax

 cmp word [es:di], BOOT_ID …
Run Code Online (Sandbox Code Playgroud)

x86 assembly real-mode bootloader x86-16

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

从引导加载程序运行时,STOSB指令不存储字节

在制作了一个小型引导程序来教我自己的汇编语言后,我注意到该stosb指令似乎不起作用.我将问题压缩到一个最小的例子:

BITS 16

start:
mov ax, 07C0h       
add ax, 288     
mov ss, ax
mov sp, 4096

mov ax, 07C0h       
mov ds, ax ;setting up stack

mov al, 'j'
mov di, buffer
stosb

mov si, buffer
jmp loops

loops:
mov ah, 0Eh
lodsb
cmp al, 0
je done
int 10h
jmp loops

done:
hlt

buffer times 64 db 0

times 510-($-$$) db 0   ; Pad remainder of boot sector with 0s
dw 0xAA55
Run Code Online (Sandbox Code Playgroud)

当运行此引导加载程序时,它应将字母存储j到缓冲区中,然后将该缓冲区打印到显示器.输出应该是:

Ĵ

运行时似乎没有打印任何东西.有什么问题,我该如何解决?

x86 assembly real-mode bootloader x86-16

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

为什么这些实模式代码可以在虚拟机上运行,​​而在我的真机上不运行?

我正在尝试将汇编代码写入 mbr 以使用 BIOS ISR。我将以下代码写入 mbr,希望在屏幕上打印字符“ABCD”:

mov ah,0x0e
mov bp,0x8000
mov sp,bp

push 'A' 
push 'B'
push 'C'
push 'D'

mov al, [0x7ffe]
int 0x10

mov al, [0x7ffc]
int 0x10

mov al, [0x7ffa]
int 0x10

mov al, [0x7ff8]
int 0x10

; infinite loop
jmp $

; padding 0s and set the  magic number to make it bootable
times 510 -( $ - $$ ) db 0     
dw 0xaa55
Run Code Online (Sandbox Code Playgroud)

这些代码在 bochs 或 qemu 模拟器上运行良好,但是当我写入我的真实磁盘并使用它来引导时,没有打印任何内容。我已经测试过将 %al 寄存器直接设置为 chars ,并且打印效果很好。我使用的是 AMD PhenomII 955 …

x86 assembly mbr x86-64 real-mode

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

CS:IP对应的物理地址在8086中超过20位会怎样?

在 8086 微处理器中,假设 CS 为 FFFFH,IP 为 FAB0H,那么物理内存地址将通过将 CS 乘以 16 并加上 IP 来计算。ie Add = FFFF0 + FAB0 这个总和会导致溢出,因为总和不能存储在 20 位中。会发生什么?

x86 intel real-mode memory-address x86-16

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

如果我们在内存地址末尾请求多字节数据会发生什么?

我正在学习汇编语言,对此有疑问。我有一个实模式下的引导加载程序,我们可以访问最多 1 mb 的内存。如果我们在 1 MB 空间的末尾位置请求 2 字节数据,会发生什么情况,它会只返回一个字节还是引发一些异常?当我们处于保护模式(启用和禁用分页)时,我也有类似的问题。另一个问题是,当程序尝试访问比裸机非分页环境中物理安装的内存更多的地址时,会发生什么?(假设在2gb机器上访问地址0x00FFFFFF,这里的地址超过2gb)我已经阅读了Intel手册的一些部分,但它们很庞大,很难找到这些信息。

x86 assembly memory-management real-mode protected-mode

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