Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly Can';t在我的引导加载程序中打印.data节中的字符_Assembly_X86_Nasm_Qemu_Bootloader - Fatal编程技术网

Assembly Can';t在我的引导加载程序中打印.data节中的字符

Assembly Can';t在我的引导加载程序中打印.data节中的字符,assembly,x86,nasm,qemu,bootloader,Assembly,X86,Nasm,Qemu,Bootloader,我正在Windows上使用NASM。我有以下NASM语法的简单汇编代码: section .data cha db 'A' section .text global _start _start: mov ah, 0xa mov al, [cha] mov cx, 1h int 10h times 510-($-$$) db 0 dw 0xaa55 我使用以下命令生成引导加载程序: nasm bootloader.asm -f bin -o bootl

我正在Windows上使用NASM。我有以下NASM语法的简单汇编代码:

section .data
    cha db 'A'

section .text
global _start
_start:
    mov ah, 0xa
    mov al, [cha]
    mov cx, 1h
    int 10h

times 510-($-$$) db 0
dw 0xaa55
我使用以下命令生成引导加载程序:

nasm bootloader.asm -f bin -o bootloader.bin
我使用ROM-BIOS内置中断在屏幕上打印字符。 问题是,当我执行程序时,它不会打印“A”,而是“S”。我试着定义不同的字母,比如“H”,但显示的是“S”。我做错了什么


注意:代码的两行结尾仅仅是因为我在QEMU中运行程序。换句话说,它们对于代码的执行毫无意义,但是对于QEMU的运行却有意义

如果您正在制作引导加载程序,则需要设置段寄存器并正确设置代码的来源。你有这方面的经验吗?在这个问题上提出了一个很好的问题,充满了建议,遗憾的是我现在记不起来了。@MargaretBloom问题不在于此。当我用“resb1”替换“db'A'”并在代码后面的“cha”变量中移动0x41时,它工作正常。为什么不起作用?这很可能是因为您没有设置段寄存器。它是从代码开始工作的,因为您只是在覆盖随机内存(不是您保留的内存),然后读取相同的位置。PS:学习使用调试器,并避免使用实模式和引导加载程序,除非被迫这样做,至少在开始时是这样。此外,您的代码不会“终止”——它不会挂起,执行将持续到结束。从源代码来看,您似乎混合了Linux汇编编程和引导加载程序编程。这就是为什么我问“段寄存器”和“源代码”是否起了作用:)这本身就是个问题<代码>-f bin使用此代码使用类似的节将数据节放在引导签名之外的文本节之后。不会加载到内存中(因为它将在第一个512字节扇区之外)。因此,您应该考虑删除<代码>数据< /代码>节,并将您的字符串放置在代码之后的文本部分和引导签名之前。您还需要将原点设置为0x7c00,且(
org 0x7c00
)位于代码顶部。当代码预计在偏移量0x7c00处运行时,缺少原点将默认为0