Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.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
Memory NASM内存未被正确访问?_Memory_Assembly_X86_Nasm_Bootloader - Fatal编程技术网

Memory NASM内存未被正确访问?

Memory NASM内存未被正确访问?,memory,assembly,x86,nasm,bootloader,Memory,Assembly,X86,Nasm,Bootloader,所以我尝试在实模式下使用NASM打印一个简单的hello world字符串。正如您可能通过org 0000:7C00定义可以看出的那样,它是一个测试引导加载程序。由于某种原因,“Hello World”没有正确打印。在VirtualBox和真实硬件中试用 当运行时,它最终打印出一堆随机形状和数字,这些形状和数字与真实字母没有任何相似之处,更不用说“Hello World”。我认为这与我的段寄存器没有正确设置有关,因为我注意到在消息定义周围移动会改变打印出来的值。我看了这个问题: 但我的问题没有

所以我尝试在实模式下使用NASM打印一个简单的hello world字符串。正如您可能通过org 0000:7C00定义可以看出的那样,它是一个测试引导加载程序。由于某种原因,“Hello World”没有正确打印。在VirtualBox和真实硬件中试用

当运行时,它最终打印出一堆随机形状和数字,这些形状和数字与真实字母没有任何相似之处,更不用说“Hello World”。我认为这与我的段寄存器没有正确设置有关,因为我注意到在消息定义周围移动会改变打印出来的值。我看了这个问题:

但我的问题没有答案,我确实将ds设置为0。知道发生了什么事吗

同样值得注意的是,我正在将其编译成一个简单的二进制文件。它之所以在结尾处打印“L”,是因为我知道在它工作之前应该打印的所有内容。或者,我猜在这种情况下,没有

BITS 16

org 0x0000:7C00

start:
        mov ax, 0
        mov ds, ax
        mov es, ax
        mov fs, ax
        mov gs, ax

        mov ss, ax ;Puts 0 into the segment pointer, we are using real memory.
        mov sp, 0000:7C00 ;Moves 7C00 into the stack pointer, so that all data <7C00 is stack.

        call print_string ;Calls print string.
        jmp Exit


;Prints the test string for now.
print_string:

        mov si, MESSAGE

    .nextChar:

        mov ah, 0x0E
        mov al, [si]
        cmp al, 0x0
        je .end

        int 10h
        add si, 1
        jmp .nextChar
    .end:
        ret


    MESSAGE db "Hello world!", 0

Exit:
    mov ah, 0x0E
    mov al, 'L'
    int 10h  


times 510-($-$$) db 0   ; Pad remainder of boot sector with 0s
dw 0xAA55      ; The standard PC boot signature
位16
组织0x0000:7C00
开始:
mov ax,0
mov-ds,ax
斧头
mov-fs,ax
mov-gs,ax
mov-ss,ax;将0放入段指针,我们使用的是实内存。

mov sp,0000:7C00;将7C00移动到堆栈指针中,以便所有数据尝试此操作以真正停止程序,而不是在最后一次int 10h之后执行垃圾

Exit:
mov ah, 0x0E
mov al, 'L'
int 10h

EndlessLoop:
jmp EndlessLoop

org 0x0000:7C00
是无效语法,尽管nasm没有抱怨。您需要的是
组织0x7c00
。而且
mov sp,0000:7C00
也无效,至少我的nasm对此表示不满。你需要
mov sp,0x7c00
在那里。啊,是的,问题是,我正在从头开始写这个,因为我现在远离源代码。我知道我的NASM根本没有抱怨,所以很可能这就是真正的源代码所说的。我现在就编辑它。(仍然无法解决我遇到的问题,但感谢您的反馈!)更新的代码在这里工作。是的,也许我回家后必须重试。我之前在我的机器上尝试过非常类似的代码,我知道它会打印随机垃圾,这意味着可能[消息]并没有指向我认为是的内存。如前所述,我确实是从内存中编写了这段代码,我相当确定这段代码与在家编写的代码基本相同。(除了您提到的错误xD)的可能重复