err:
MOV AH, 0x0E
MOV BX, 0x0007
MOV SI, 6
.loop:
MOV AL, [SI+.msg-1]
INT 0x10
DEC SI
JNZ .loop
JMP restart ;jumps to the start of the program to for all intents and purposes equivalent to a complete reset
.msg db CR, LF, ".rrE"
此代码是较大程序的一部分,并打印消息“Err”。 (当然不包括引号)后面跟着换行和回车。这可以在我的笔记本电脑上使用 Intel Atom N570 64位双核,但不能在我的电脑上使用 Intel Core i5-3570K 64bit四核,也不能在我的笔记本电脑上使用 AMD turion 64 X2 64位双核。在后两者上印刷了一系列六个空白。
此代码只能通过JMP err
命令访问,并且整个程序可以工作,就我能够测试而言,相当于所有三个CPU。
我现在已经破坏了我的大脑一段时间,因为我确信这是我忽略的一些非常简单的事情。由于这无济于事,以下是我对互联网的帮助......这种行为可能是什么原因?
答案 0 :(得分:0)
您的细分设置不正确。在实际模式下,您通常应该使用
启动程序mov ax,cs
mov ds,ax
; ...
or
mov ax,data_segment
mov ds,ax
如果您忘记了这一小步骤,代码看似正确,但基于DS
的内存读/写将最终在错误的地址。你的空白可能来自某个地方NULL
个字节。
在Atom上,您的CS
和DS
“恰巧”匹配。