![]() |
1
4
L1 是 通常/可能 标签 , 与内存中的一个特定地址相关联。程序员为了方便而定义各种标签,这些标签被用来象征性地表示内存中的特定位置(l1是一个糟糕的名称;标签通常表示位置的潜在用途:比如pingcounter、errormessage、login等等)。
一个1字节静态存储的标签是C编译器将如何实现
在NASM语法中,
但是
在汇编语言中,这种间接寻址模式是用方括号括住给定指令的源操作数或目标操作数来表示的。(但不能同时使用:x86只支持每条指令最多一个显式内存操作数。)
使用存储在l1中的地址来定位内存中的某个位置,并在该位置读取1字节(=8位=AL寄存器的大小),然后将其加载到AL寄存器中。
反过来做。即,具体地说,读取存储在l1中的地址,使用这个地址在存储器中找到一个特定的位置,并将al寄存器的内容存储在那里。
如果您理解以下信息对于x86系列中较新的处理器来说是不完整和有些过时的,那么
primer on the 8086 architecture
对于开始使用x86系列的汇编语言可能非常有用。
|
![]() |
2
3
很难理解你的问题,但我会尽力帮忙的。 在程序集中,符号只是地址的名称。在汇编源代码中,l1是在别处定义的符号,汇编程序将其解析为内存偏移量。 解引用时(使用[]符号),可以解引用寄存器(如“mov al,[esi]”)或地址(如“mov al,[l1]”)。这两个语句做同样的事情,唯一的区别是地址来自哪里。 我建议下载 Intel CPU Documentation 并浏览指令参考。如果您不想不知所措,可以从一个较旧的x86处理器(比如486或更旧的处理器)开始阅读,该文档并不十分友好,但手头有它是非常有用的。 我不知道NASM的具体内容,15年前我在TurboAssembler中学习过汇编,现在这些知识仍然很有用:) 另外,我建议您尝试在google上搜索“x86程序集教程”,您会发现许多相关的文档可能对您有用。 |
![]() |
3
1
我很确定这只适用于创建引导加载程序的情况。这是“引导签名”。假设您将此代码写入软盘(您生成的机器代码是否也正好是512字节?),那么当你想用这个引导加载程序代码启动计算机时,bios会查看软盘并确定它是否是一个真正的引导加载程序。为此,它将查看软盘第一个扇区的最后两个字节,该扇区应该是
在你的源代码中,就像最后一行
|