从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
这根本无法打印任何东西。我想了解两者之间的区别。有什么帮助吗?
答案 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跳过它们就会避开它们。