NASM指令序列

时间:2017-03-08 06:35:21

标签: assembly nasm

https://github.com/cfenollosa/os-tutorial/tree/master/05-bootsector-functions-strings学习,我一直在尝试编写自己的引导扇区。

我正在尝试打印给定的字符串。

这是我的两个文件:

boot_main.asm

[org 0x7c00]

mov bx, hello
call print
jmp $

hello db 'HI', 0

%include "boot_print.asm"

times 510 - ($ - $$) db 0
dw 0xaa55

boot_print.asm

print:
    pusha

start:
    mov al, [bx]
    cmp al, 0
    je done

    mov ah, 0x0e
    int 0x10

    add bx, 1
    jmp start

done:
    popa
    ret

print_nl:
    pusha
    mov ah, 0x0e
    mov al, 0x0a
    int 0x10
    mov al, 0x0d
    int 0x10

    jmp done

现在这完美无缺,并在屏幕上打印“HI”。但是如果我将指令hello db 'HI', 0移到开头。即

boot_main.asm

[org 0x7c00]

hello db 'HI', 0

mov bx, hello
call print
jmp $

%include "boot_print.asm"

times 510 - ($ - $$) db 0
dw 0xaa55

这根本无法打印任何东西。我想了解两者之间的区别。有什么帮助吗?

1 个答案:

答案 0 :(得分:3)

汇编程序根据您在源文件中的写入位置将内容放入内存中。如果你把它放在开头,在HI\0指令之后,jmp $字符串将放在那里,并且CPU会尝试运行它,好像它是代码一样(做无意义的东西,可能是错误的)。

在原始代码中,字符串位于[org 0x7c00] jmp real_start hello db 'HI', 0 real_start: mov bx, hello call print jmp $ %include "boot_print.asm" times 510 - ($ - $$) db 0 dw 0xaa55 之后,它被安全地存储在指令指针未到达的位置。

如果您修改代码以使CPU回避字符串,您将看到它再次开始工作:

db

同样,如果您认为$tableName = 'yourtable'; $backupFile = 'backup/yourtable.sql'; $query = "SELECT * INTO OUTFILE '$backupFile' FROM $tableName"; $result = mysqli_query($con,$query); 对字符串没有任何魔力,它只会在您编写它的位置输出输出二进制中的任意字节,这一点就变得很明显了。如果你在执行路径中写它们,CPU会在它们上面运行,如果你告诉CPU跳过它们就会避开它们。