2
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 64 位四核的 PC 或配备AMD turion 64 X2 64 位双核的笔记本电脑。在后两者上,改为打印一系列六个空白。

该代码只能通过JMP err命令访问,并且就我能够测试的情况而言,整个程序都可以在所有三个 CPU 上运行。

我为此绞尽脑汁了一段时间,因为我确信这是我忽略的一些非常简单的事情。由于这无济于事,这是我向互联网求助的呼声……这种行为可能是什么原因?

4

1 回答 1

0

您的分段设置不正确。在实模式下,您通常应该使用以下命令启动程序

mov ax,cs
mov ds,ax
; ...

or

mov ax,data_segment
mov ds,ax

如果你忘记了这个小步骤,代码看起来是正确的,但是基于内存的读/写操作DS最终会出现错误的地址。你的空白可能是NULL来自某个地方的字节。

在 Atom 上,你CSDS“巧合”匹配。

于 2013-09-17T07:27:14.413 回答