我是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)?
我已经阅读了关于BIOS中断的信息,并且知道它们只能在8086实模式下访问.
我的问题:
还有其他中断吗?我已经阅读过关于DOS中断的内容,但我很困惑,如果它们在实模式下也可用,以及DOS中断列表是什么.
进入保护模式后,存储在0x00的BIOS中断表会发生什么?是替换,还是存在但只是无法访问?
我有以下代码,它采用十六进制格式的数字并打印出其十进制格式.
这个程序在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之后挂起.
这是(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_32 虚拟 8086 或实模式下使用EAX, EBX,... ?我知道,这些寄存器具有32位(和,即当然它们的非扩展部分是16个比特宽)的尺寸,但并不在类解释的,在该模式中可以使用它们,只有FS和GS是仅在保护模式下允许。
我正在尝试编写一个实模式引导加载程序,但我目前在尝试启用 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) 在制作了一个小型引导程序来教我自己的汇编语言后,我注意到该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到缓冲区中,然后将该缓冲区打印到显示器.输出应该是:
Ĵ
运行时似乎没有打印任何东西.有什么问题,我该如何解决?
我正在尝试将汇编代码写入 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 …
在 8086 微处理器中,假设 CS 为 FFFFH,IP 为 FAB0H,那么物理内存地址将通过将 CS 乘以 16 并加上 IP 来计算。ie Add = FFFF0 + FAB0 这个总和会导致溢出,因为总和不能存储在 20 位中。会发生什么?
我正在学习汇编语言,对此有疑问。我有一个实模式下的引导加载程序,我们可以访问最多 1 mb 的内存。如果我们在 1 MB 空间的末尾位置请求 2 字节数据,会发生什么情况,它会只返回一个字节还是引发一些异常?当我们处于保护模式(启用和禁用分页)时,我也有类似的问题。另一个问题是,当程序尝试访问比裸机非分页环境中物理安装的内存更多的地址时,会发生什么?(假设在2gb机器上访问地址0x00FFFFFF,这里的地址超过2gb)我已经阅读了Intel手册的一些部分,但它们很庞大,很难找到这些信息。