2015-11-02 89 views
1

的我有点新的x86架构,并组装。我有这段我不明白的代码。的英特尔x86架构“DB”,并DOSBOX

data1 SEGMENT 
    dat1 db 'ABCDEFGH' 
data1 ENDS 

这是在代码的开头。后来我们正在使用这个数据1中的代码:

mov ax, data1 
mov ds, ax 

我使用DOSBOX作为仿真器和涡轮调试器,并在那里它显示为:

mov ax, 0B14 
mov ds, ax 

任何想法,为什么?一般来说,我也不了解db的用法。有时用于显示消息,有时与我的示例类似。

非常感谢你提前:)

+0

这是一个错字? 'mov ax,donnee1'你是不是指'mov ax,data1'? –

+0

@ user3144770是的,它是谢谢:) – Ege

回答

1

db语句用于定义字节。这实际上不是指令,而是程序集用户将自定义数据放在某处。该数据是在存储器中的特定位置,所以拆卸后的数据示出,而不是标签,其在所用的代码的地址。标签只是地址的占位符,由汇编程序分配。

1

事实上,data1是在代码的开头并不太重要。汇编器/链接器将在EXE中给它一个合适的位置。所以在调试器中看到mov ax, 0B14是完全可能的。 0B14h是该数据段放置在EXE中的地址。

这里没有你的榜样和使用db显示消息相差无几。至多在后一种情况下,会添加一个终止字节。

dat1 db 'ABCDEFGH' 

dat1 db 'ABCDEFGH',0 

dat1 db 'ABCDEFGH','$' 
+0

确定非常感谢你,但现在我有一个问题:)然后当我去到DS我0B14应该能够看到“ABCDEFGH”,可能是在ASCII但是当我做,我看到一些随机数字。顺便说一句,假设ds:data1,所以它应该在ds – Ege

+0

如果值0B14h是EXE中的实际编码值,那么它将通过程序加载程序的重定位过程而被更改。因此,当您使用调试器时,您必须知道事情的具体位置。无法帮助你。 –

+0

@thebok和用户numberguy:0B14是* *段,而不是段内的地址。一旦你的代码执行了'mov ds,ax','ds:[dat1]'处的内存应该保存你的ASCII字符串。请注意'data1'是一个段标签,'dat1'是一个常规标签。 IDK如果DOS程序得到任何运行时重定位。 16位分段存储器模型并不是一个非常有用的东西,尤其是要学习。如果你只是想学习装配。这些天对asm有用的东西主要是编写优化的内部循环(例如,用于像视频编解码器之类的东西),它在64位模式下运行,具有分页内存。见http://agner.org/optimize/ –