【发布时间】:2017-11-10 15:37:09
【问题描述】:
我正在尝试在 16 位实模式下编写 DOS 克隆,尽管一旦我完成了当前问题,我可能只学习 32 位汇编。过去我的问题被否定了,但这是最后一次,恐怕我确实需要咨询这个网站。在我之前的问题的基础上,我做了更多的努力来了解更多关于我的汇编代码中的指针和堆栈的信息。
显然,指令cmpsb 比较了两个字符串,分别位于ES 和DS。我正在尝试将 INPUT_STRING 的值移动到 DS 并将 shutmsg 的值移动到 ES,这似乎是正确的寄存器(这些是之前声明的变量) .我的指令看起来不错,编译也很好,但是当我输入 shutdown 时它不起作用,当我通过 GDB 运行它时,它显示的只是
0x0000fff0 in ?? ()
我不知道怎么了。我真的没有。这是我的代码:
prompts:
mov si, prompt
call prints
call scans
push ds
mov ds, [INPUT_STRING]
mov es, [shutmsg]
mov cx, 0xFFFF
cld
repe cmpsb
pop ds
je shutdown
mov si, newline
call prints
mov si, INPUT_STRING
call prints
mov si, newline
call prints
jmp prompts
在此先感谢,如果这又是一个糟糕的问题,我们深表歉意。
【问题讨论】:
-
DS 和 ES 是 segment 寄存器,只是指针的一半。两个字符串的完整指针是 DS:SI 和 ES:DI
-
您从哪里读到
cmpsb比较了“分别位于 ES 和 DS 中”的两个字符串?看来您需要继续阅读。 -
@cHao Hmmm...尝试时,汇编器抛出“操作码和操作数的无效组合”
-
@davmac 我想在某处的在线文档网站上,但是,再次检查,我发现它是 DS:SI 和 ES:DI
-
@SafalAryal 我祝你一切顺利,但如果你略读一些内容并在每次遇到最轻微的障碍时跳到stackoverflow,你就不会走得太远。你需要自己做研究。