有什么我不能摘要。我在学习一些汇编而现在我在这一章处理的问题。我理解这个概念的括号取消引用,但是不知怎的,当我看到使用它,我只是不能享受。要多一点的确切这里就是我的混乱开始:

mov al, [L1]

在这里,我想L1作为一个例子情况下是一些种类的宏其后代的一个真正的地址机器码,对吧?

那么,该指令不是:取消引用 al 登记册(因为你几乎不能改变地址的物理)和改变价值的一个存在 L1.

如果到现在一切都确定:

mov [L1], al

这将analogicaly的意思是,必须有一个地址储存的(因此就出现了一些点在这样做),并改变它的其他一些地方存在,对吗?

如果你能告诉我这是确定的情况下,你没有看到任何错误,请这样做,这将使我能够继续学习。

最后一件事,NASM增加了一堆 0xAA55 在我的代码(这个顺序应该结束程序的权利?), 为什么有这么多次?

有帮助吗?

解决方案

L1 通常/可能 标签, 与一个特定的地址在存储器。该程序界定了各种标为他/她的方便,而这种标签是用来象征性地代表一个特定的位置存储器(L1是一个糟糕的名称;标通常是指示性的基本目的位置:说PingCounter,错误消息,登录等等)。

标签字节1的静态存储是如C编译器会实现 char L1; 在全球范围。


在NASM语法, mov edi, L1 将组装的 mov eax, imm32 形式 mov, 即该地址的标签将成为一个32位立即在机器码。(汇编不知道最后的数值,但接头。) 请注意,在MASM法,这将是一个载荷,你会需要 mov edi, OFFSET L1 得到一个地址的标签,作为一个即时的。

mov al, [L1] 将组装到一个不同的指令中,有32位地址嵌入的机代码作为一个地址被取消引用的.该指示载荷1字节的地址L1,并将其放在AL。

在大会的语言,这种间接的解决方式是意味着通过广场包围源或目的操作的一个给予的指令。(但不是这两种:x86仅支持至多一个明确的存储器操作数的每个指令。)

mov al, [L1]

使用的地址存在L1,以找到一些住在存和读取1byte(=8位=的大小AL登记册)在这个位置,并将其载入的阿登记册。

  mov [L1], al

这不会逆转。即,具体来说,阅读存储的地址在L1,使用这个地址来寻找某一特定地点在存储和存储内容的AL登记册。


前提是你了解以下信息是不完整的,并有些过时的有关的新的处理器在x86的家庭,这个 底漆对8086建筑 可能是非常有用的,获得一个开始与大会的语言为x86家庭。
对优势的开始,这个"古代的CPU"(仍在使用,实际上),是基本概念都在那里,未支配余额的较新的组寄存器,花哨的处理模式,操作模式及其他概念。大大小,功能和模式的新的Cpu仅仅是介绍组合爆炸的选择,所有的(最?) 他们用他们的方式,但基本上不相关的一起爆。

其他提示

这是很难按照你的问题,但我会尽力帮忙。

在组件中,一个符号仅仅是一个地址的名称。在汇编源,L1是别处定义的符号,其汇编器将解决作为偏移到存储器中。

当解除引用(使用[]表示法),就可以解除引用一个寄存器(如在 “MOV人,[ESI]”)或地址(如在 “MOV人,[L1]”)。这两个语句做同样的事情,唯一的区别就是地址的来源。

我建议下载英特尔CPU文档并通过指令参考撇去。如果你不想被淹没呢,开始从旧的x86处理器(比如486或以上),该文档是不完全友好的阅读,但它是非常有用的手头上。

我不知道NASM的具体情况,我15年前与涡轮汇编了解到组装,今天有用的知识仍然是:)

另外,可能我建议你试试谷歌搜索的“x86汇编教程”,你会发现很多相关的文档可能对你有用。

  

哦,和最后一两件事,NASM增加了   0xAA55将一束下我的代码(这   序列是应该结束   节目吧?),为什么会这样   多次?非常感谢你的   它读取到这里..

我敢肯定,这就是只适用,如果你的创造一个引导程序。这是“引导签名。”假设你写这个代码到软盘(是你生产的机器代码也正好是512字节?),以及当你要开始与该引导程序代码的计算机,BIOS会看一下软盘,并确定它是否是一个真正的引导程序。为了做到这一点,将着眼于软盘的第一个扇区,这应该是0xAA55,以表明它是可引导的最后两个字节。(还有,这如果以同样的方式你的启动关闭的硬盘,或拇指驱动器,或任何。用于CD略有不同,因为它们具有4096个字节的扇区)

在你的源代码,就像是最后一行类似$(times.. db 0xAA55或类似的东西?如果你不是在做一个引导程序打算,可以有效地删除了这一行。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top