Assembly 选择性代码功能

Assembly 选择性代码功能,assembly,x86,Assembly,X86,这段代码是较大程序的一部分,打印消息“Err.”(当然不包括引号),然后是换行符和回车符。这适用于配备Intel Atom N570 64位双核的笔记本电脑,但不适用于配备Intel core i5-3570K 64位四核的笔记本电脑,也不适用于配备AMD turion 64 X2 64位双核的笔记本电脑。在后两张纸上,一系列的六块空白被打印出来 这段代码只能通过JMP err命令来访问,而整个程序就我所能测试的而言,在所有三个CPU上都是等效的 我在这件事上伤了一段时间的脑筋,因为我确信这是我

这段代码是较大程序的一部分,打印消息“Err.”(当然不包括引号),然后是换行符和回车符。这适用于配备Intel Atom N570 64位双核的笔记本电脑,但不适用于配备Intel core i5-3570K 64位四核的笔记本电脑,也不适用于配备AMD turion 64 X2 64位双核的笔记本电脑。在后两张纸上,一系列的六块空白被打印出来

这段代码只能通过
JMP err
命令来访问,而整个程序就我所能测试的而言,在所有三个CPU上都是等效的


我在这件事上伤了一段时间的脑筋,因为我确信这是我忽略的一件极其简单的事情。既然这是徒劳的,下面是我对互联网的呼救。。。这种行为的原因可能是什么?

您的网段设置不正确。在实际模式下,您通常应该以

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"
如果您忘记了这一小步,代码似乎是正确的,但是基于
DS
的内存读/写将以错误的地址结束。您的空格可能是某个地方的
NULL
字节


在原子上,你的
CS
DS
是“巧合”匹配的。

你的
CR
LF
似乎是相反的。控制台上的正常下线为
CRLF
;您正在将其打印为
LFCR
。这通常不重要,但请按相反的顺序尝试,看看会发生什么。这是我使用损坏的USB驱动器启动程序时的产物。它只与LFCR一起工作,并以其他方式打印出一系列随机外观的符号,此外,它还有一些其他奇怪且无法解释的特性。不管怎样,我尝试了你的建议,但没有解决问题。
ds
指向你的数据吗?所以这毕竟是一件非常简单的事情。谢谢你,成功了。我把它改成了
MOV-AL[CS:SI+.msg-1]
,它成功了。我现在觉得自己很愚蠢=史努比生来就知道这些!
mov ax,cs
mov ds,ax
; ...

or

mov ax,data_segment
mov ds,ax