选择性代码功能

时间:2013-09-14 01:49:32

标签: assembly x86

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。

我现在已经破坏了我的大脑一段时间,因为我确信这是我忽略的一些非常简单的事情。由于这无济于事,以下是我对互联网的帮助......这种行为可能是什么原因?

1 个答案:

答案 0 :(得分:0)

您的细分设置不正确。在实际模式下,您通常应该使用

启动程序
mov ax,cs
mov ds,ax
; ...

or

mov ax,data_segment
mov ds,ax

如果您忘记了这一小步骤,代码看似正确,但基于DS的内存读/写将最终在错误的地址。你的空白可能来自某个地方NULL个字节。

在Atom上,您的CSDS“恰巧”匹配。