程序集x86,每个数组的地址是什么? 检查我的答案

问题描述

SECTION .DATA
V1 DB "ABC",0AH,0BH,10,11,-1,-2
V2 TIMES 2 DD 0X124F77AB
V3 DW 5,0XFE,-12,32,100

假设地址从1000H开始,每个变量的基址是什么?

我的尝试:

  • V1 = 1000H

  • V2 = 1016H(+8字节)

  • V3 = 1032H(+8字节)

在V3之后,它将是1056H(+16字节)吗?

解决方法

startsWith()

V1标签指向DB(定义字节)指令。该指令的数据如下:1.一个3个字母的字符串,2。两个十六进制数字,3。两个正十进制数字和4.两个负十进制数字。

带有字符串的

DB分配与字符串中一样多的字节。 (这些字节代表字母,ASCII还是UTF-8编码的代码点对汇编程序都无所谓,它只看到字节。)这里是3个字节。

带有数字的DB为此数字分配一个字节。数字的指定基数无关紧要。数字更具体地讲是数字表达式,即它们可以具有多个由运算符连接的术语。这是6个字节。

整个DB指令分配3 + 6 = 9个字节。

V2标签指向TIMES指令,后跟DD(定义双字)指令。 TIMES插入以下指令的次数与为其指定的编号(数字表达式)指定的次数相同。这是2。每个重复都是一个具有单个数字的DD,再次以十六进制形式给出。带有数字的DD分配一个双字。这里的“字”是指基于8086的体系结构,因此“字”为16位。这与2个字节的长度相同。因此,“双字”为32位,长度与4个字节相同。因此,TIMES和DD指令占用2乘以4字节,8字节。

V3标签指向DW(定义字)指令。同样,这里的“字”是指8086的16位操作数。因此,每个数字占用2个字节。由于有6个数字,每个数字占用一个字会导致12个字节。

这意味着虚拟起始时间(vstart)为1000h,V1为1000h,V2为1000h + 9,V3为1000h + 9 + 8,在V3行之后,下一个地址将为1000h + 9 + 8 + 12。

现在剩下的唯一障碍是将地址表达式转换为每个数字。您将必须了解十六进制数字表示形式,才能正确汇总和列出此格式的地址。对于V2,结果为1009h,对于V3,结果为1011h,对于下一个地址为101Dh。