【发布时间】:2016-10-16 00:59:02
【问题描述】:
如果: (我相信寄存器是相邻的......)
A BYTE 0xB, 0d20, 0d10, 0d13, 0x0C
B WORD 0d30, 0d40, 0d70, 0hB
D DWORD 0xB0, 0x200, 0x310, 0x400, 0x500, 0x600
然后:
- 什么是[A+2]?答案是 0d20 或 0x15
- 什么是 [B+2]?答案是 40 或 0x28
- 什么是 [D+4]?不确定
- 什么是[D-10]?不确定
我认为这些是答案,但我不确定。由于一个 WORD 是 1 个字节,而 DWORD 是 2 个 WORDS,因此,例如,当您计算 [B+2] 的数组时,您应该从 0d30 开始,然后是 0d40(计算两个 WORD)。而 [A+2] 是 0d20 因为你要计算两个字节。我究竟做错了什么?请帮忙。谢谢
编辑
这是因为:考虑到 A、B 和 D 的第一个值是偏移量 x86 是小端序... A = 0d10,从那里再数 2 B...字节(十进制)= 30,0,40,0,70,0,11,0 B 是 0d40,从那个 D...bytes (in hex) = 0x200, 0,0,0,...0,2 再计算 2 个字节, 0,0,...0x10,3,0,0,...0,4,0,0,...0,5,0,0,...0,6,0,0 D是 0x200。从那里数 4 个字节。从 0xb0 倒数 10 个字节。那么 [D-10] 不等于 0x0C 吗?谢谢
另外,如果我做了 [B-3],会是 0d13 吗?有人告诉我它实际上在 0d10 和 0d13 之间,因此它将是 0A0D,并且由于小端将是 0D0A。那是对的吗?谢谢!! 编辑
【问题讨论】:
-
答案取决于操作数的大小以及您的汇编程序是使用字节偏移还是类型化索引。
-
不知道MASM用什么,但第一个答案肯定是错的。记住偏移量从零开始。这就是
0d10。[B+2]对字节偏移是正确的。[D+4]只是0x200因为 4 个字节只是第二个 dword。[D-10]很棘手,它将从A的0d13开始,一直到B的0d30,给你0x001E0C13(由于小端序)。 -
哦,现在我明白了,那些“20 或 0x15”和“40 或 0x28”表示相同的数字,对吧?然后你转换了 20 个错误,它是
0x14(1*16 + 4 = 20)。无论如何,尽快学会编译一些东西+在调试器中启动它,在那里你可以使用内存窗口来验证产生了哪些字节,并在指令视图中查看如何将哪些地址编译成那些 +2 的指令。 -
你能解释一下你是如何得到 A 的 0d13 和 B @Jester 的 0d30 的吗?谢谢你。是不是因为两个 WORD 等于一个 DWORD,那么当你倒数时,B 中的每个值都会占用两个“槽”? A 中的每个值都会占用四个“槽”?谢谢。
-
所以是因为:考虑到 A、B 和 D 的第一个值是偏移量 x86 是小端... A = 0d10,从那里再算 2 B...字节(十进制)= 30,0,40,0,70,0,11,0 B 是 0d40,从 D 中再计算 2 个字节...字节(十六进制)= 0x200, 0,0,0,.. .0,2,0,0,...0x10,3,0,0,...0,4,0,0,...0,5,0,0,...0,6,0 ,0 D 是 0x200。从那里数 4 个字节。从 0xb0 倒数 10 个字节。那么 [D-10] 不等于 0x0C 吗?谢谢
标签: arrays memory assembly x86 masm