1

这是一个简单的问题,但我是汇编语言的新手。任何人都可以回答他们吗?谢谢。

A BYTE 0Ah,20,10,40

B WORD 30,40,50,0Bh

D DWORD A00,200,300,400,500,600

A[2]a) 移入eax 寄存器的单行命令是什么

b) 是什么[A+2]

c) 是什么[B+2]

d) 是什么[D+4]

e) 是什么[D-10]

答案:

a)  mov eax, A[2]

b)  [A+2] is third array position that is 10.

c)  [B+2] is zero

d)  [D+4] is 200

e)  [D-10] is byte 40   
4

1 回答 1

1

a) A[2] 只不过是一个字节的信息,因此,您应该将其移动到一个字节长的寄存器中。您可以将其移动到寄存器的低字节EAX写入MOV AL, [A+2].(*) Check the EAXregister configuration here。那么,你的代码会做什么呢?嗯,它的意思是从寄存器中移动 4 个字节[A+2]EAX因为 4 个字节是EAX.

c)这取决于你记忆的字节顺序。在大多数 PC 中,您的答案将是错误的,因为数据是按原样存储的30 00, 40 00, ....,最高有效位在右侧(这种存储数据的方式就是所谓的little-endian方式),但是如果您的 CPU 架构确实实现了大端方式。

e)如果您以您发布的确切方式声明数据段,那么您将拥有[D-10] = [A+2] = 10. 原因是,内存中的数据B填充了 8 个字节,[A+3]是第 9 个和[A+2]第 10 个字节,倒数。

(*)请注意,正如迈克尔在下面的评论中所报告的,您可以使用movsxmovzx说明。

MOVSX EAX, [A+2][A+2]字节移动到EAX双字,扩展数字的符号。

MOVZX EAX, [A+2][A+2]字节移动到EAX双字,将所有 0 放在剩余的 24 位中。

其他答案对我来说似乎是正确的。

于 2013-10-08T18:51:54.457 回答