Assembly 如何访问.data中的特定数据

Assembly 如何访问.data中的特定数据,assembly,nasm,Assembly,Nasm,我很确定这是可能的,但我找不到当.data部分中的某些数据被这样声明时如何访问它们(在nasm中): 例如,如果我想将第四个移动到寄存器,我该怎么做?这非常简单。以下是它的英特尔表示法: mov al, [msg+3] 为了解决此答案注释中的后续问题,您可以像这样迭代数组,假设使用16位模型(对于32位模型,请使用ebx等)(还要注意,我在数组末尾添加了0xFF。还有很多其他方法可以做到这一点,这只是其中之一): 此代码假设您定义了一个引用为printAL的函数来处理al,并且您从其他地方调

我很确定这是可能的,但我找不到当.data部分中的某些数据被这样声明时如何访问它们(在nasm中):


例如,如果我想将第四个移动到寄存器,我该怎么做?

这非常简单。以下是它的英特尔表示法:

 mov al, [msg+3]
为了解决此答案注释中的后续问题,您可以像这样迭代数组,假设使用16位模型(对于32位模型,请使用ebx等)(还要注意,我在数组末尾添加了0xFF。还有很多其他方法可以做到这一点,这只是其中之一):


此代码假设您定义了一个引用为
printAL
的函数来处理
al
,并且您从其他地方调用了此代码(因此调用了
ret
)。

这非常简单。以下是它的英特尔表示法:

 mov al, [msg+3]
为了解决此答案注释中的后续问题,您可以像这样迭代数组,假设使用16位模型(对于32位模型,请使用ebx等)(还要注意,我在数组末尾添加了0xFF。还有很多其他方法可以做到这一点,这只是其中之一):


此代码假定您已经定义了一个引用为
printAL
的函数来处理
al
,并且您已经从其他地方调用了此代码(因此称为
ret
).

我真的想投票结束这个问题,但我没有看到任何真正接近的东西,尽管这个问题是基本性质的。我真的想投票结束这个问题,但我没有看到任何真正接近的东西,尽管这个问题是基本性质的。就像我说的,我知道这是一个非常基本的问题。无论如何,谢谢你的回复。但我还有一个问题与前一个问题有关:如果我想使用循环遍历数组,我应该怎么做,因为:mov al,[msg+'register']不起作用?在这种情况下,是否有任何特殊的寄存器可以使用?我已经添加了额外的代码来帮助您。如果原来的答案解决了你的问题,你应该接受这个答案。此外,与其在评论中提出新的问题,不如提出新的问题。@B.Wing
mov al,[msg+eax]
有效,所以不确定什么不适合你。(也许你是受虐狂,试图为16b实模式编码,那么只有一些组合是合法的:……无论如何,你无法“猜测”汇编中什么是合法的,请查看《英特尔教学指南》了解所有详细信息什么是有效的,以及每条指令是如何工作的)我真的很困惑,为什么这么多学校似乎坚持教授分段内存。除非他们要教你编写一个引导加载程序,然后让你进入保护模式或长模式,否则今天的重点是什么?不管怎样,我想这就是行动的来源@Ped7g@DavidHoelzer也许他们想让他们教操作系统开发。。哦,等等,在操作系统中,只要准备好就可以切换到保护模式。隐马尔可夫模型。。。也许是8086?我从来没有见过它的实际应用,但从问题开始,我已经不喜欢它了,非常草率的汇编程序,学生们仍然完全错过了调试的概念。所以一定是一些秘密的原因,看不到任何积极的方面,特别是在教学方面(有一次我的朋友给我看了Watcom C+DOS/4GW,我只写了很少的16b ASM字节。通常256B简介D最多只能写256B)。就像我说的,我知道这是一个非常基本的问题。无论如何,谢谢你的回复。但我还有一个问题与前一个问题有关:如果我想使用循环遍历数组,我应该怎么做,因为:mov al,[msg+'register']不起作用?在这种情况下,是否有任何特殊的寄存器可以使用?我已经添加了额外的代码来帮助您。如果原来的答案解决了你的问题,你应该接受这个答案。此外,与其在评论中提出新的问题,不如提出新的问题。@B.Wing
mov al,[msg+eax]
有效,所以不确定什么不适合你。(也许你是受虐狂,试图为16b实模式编码,那么只有一些组合是合法的:……无论如何,你无法“猜测”汇编中什么是合法的,请查看《英特尔教学指南》了解所有详细信息什么是有效的,以及每条指令是如何工作的)我真的很困惑,为什么这么多学校似乎坚持教授分段内存。除非他们要教你编写一个引导加载程序,然后让你进入保护模式或长模式,否则今天的重点是什么?不管怎样,我想这就是行动的来源@Ped7g@DavidHoelzer也许他们想让他们教操作系统开发。。哦,等等,在操作系统中,只要准备好就可以切换到保护模式。隐马尔可夫模型。。。也许是8086?我从来没有见过它的实际应用,但从问题开始,我已经不喜欢它了,非常草率的汇编程序,学生们仍然完全错过了调试的概念。所以一定是一些秘密原因,看不到任何积极的方面,特别是出于教学目的(有一次我的朋友给我看了Watcom C+DOS/4GW,我只写了很少的16b ASM字节..通常最多256B用于256B简介:D)。
     mov bx, msg
 next:
     mov al, [bx]
     cmp al, 0xff
     je  done
     call printAL
     inc bx
     jump next
 done:
     ret

 msg: db 0xEA, 0xBA, 0x35, 0xB4, 0x88, 0x24, 0x14, 0x2C, 0xA1, 0x97, 0x5F, 0x1B, 0x56, 0xFA, 0xA3, 0xFF