【发布时间】:2019-07-11 10:56:47
【问题描述】:
我正在尝试创建一个操作系统,我不了解汇编语言的所有内容,我主要是边走边学。这就是问题所在,我构建了一个简单的函数来比较两个字符串(eax 和 ebx)问题是当我运行代码来执行此操作时,我的系统在调用后没有执行任何操作......我做错了吗?
compare:
xor ecx, ecx
.by_char:
mov dh, [eax+ecx]
mov dl, [ebx+ecx]
cmp dh, dl
inc ecx
je .zero_test
stc
jmp .done
.zero_test:
cmp dh, 0
je .done
jmp .by_char
.done:
ret
这里是我调用这个函数的代码供参考:
start:
mov esp, stack
mov si, msg_welcome
call print
mov eax, msg_welcome
mov ebx, msg_diskerr
call compare
jc j_aa
jmp j_bb
j_aa:
mov si, msg_strnequ
jmp part_b
j_bb:
mov si, msg_strrequ
part_b:
call print
mov eax, msg_booting
mov ebx, msg_booting
call compare
jc j_cc
jmp j_dd
j_cc:
mov si, msg_strnequ
jmp part_c
j_dd:
mov si, msg_strrequ
part_c:
call print
jmp halt
halt:
hlt
jmp halt
这里是我定义变量的地方:
bss:
msg_welcome: db "Welcome To Hypr Byte!", 10, 13, 10, 13, 0
msg_nokernl: db "FATAL: Missing or Corrupted Kernel. System Halted...", 10, 13, 10, 13, 0
msg_diskerr db "FATAL: An error occured while attempting to read the disk. Please go to https://www.instinct-loop.xyz/hypr/help to recieve support...", 0
msg_bterror db "Uh oh! An error occured while attempting to boot. Please go to https://www.instinct-loop.xyz/hypr/help to recieve support...", 0
msg_booting db "Attempting to load the kernel...", 10, 13, 10, 13, 0
msg_kreturn db "Oops! The kernel ran into a fatal error... System Halted!", 0
msg_strnequ db "Strings are Not Equal!", 10, 13, 0
msg_strrequ db "Strings are Equal!", 10, 13, 0
【问题讨论】:
-
您的操作系统是 16 位还是 32 位? - 因为这个
mov si, msg_welcome加载一个16 位指针,而这个mov eax, msg_welcome加载一个32 位指针。 -
@500-InternalServerError 我相信您可能会遇到问题,我的操作系统是 16 位的,但是当我尝试在比较函数中使用 16 位寄存器时,它告诉我我给它一个无效的有效地址。
-
在
inc ecx之后执行je .zero_test不是一个好主意,因为它会修改标志。你正在用它测试ecx==0。不应该直接导致你的问题。 PS:在尝试编写操作系统之前学习使用调试器。 -
@Jester 感谢您的提示和信息,将考虑获取调试器并移动了增量语句,但是当我运行操作系统时,它崩溃了 VirtualBox。
-
@Jester 当我说它使虚拟盒崩溃时,我的意思是虚拟盒提醒我它在模拟系统时遇到错误并不得不退出。
标签: assembly x86 operating-system virtualbox osdev