任何人都可以仔细检查这个,看看我做得对吗?
1. create the following variables in the data section. Declare them as WORD (not BYTE or DWORD)
num1 (initialize to 0FACE hex)
num2 (initialize to 0FEED hex)
In the code section write code to do the following:
2. You should populate the following registers with the following values in the following order:
edx = 0D2C6FFFE hex
ebx = 0FFFFFFFFh
eax = 0FFFFFFFFh
bh = 249 decimal
bl = 11110111 binary
ecx = 0FFFFFFD3 hex
3. After you populate the above registers you should evaluate the following expression:
eax = bl + bh + cx + num1 + num2 + edx
我知道了:
eax = 3,356,452,476 (base 10)
代码:
mov edx, 0d2c6fffeh ;edx = 0d2c6fffeh
mov ebx, 0ffffffffh ;ebx = 0ffffffffh
mov eax, 0ffffffffh ;eax = 0ffffffffh
mov bh, 249d ;bh = 249 (base 10) = 0f9h = 11111001b
mov bl, 11110111b ;bl = 11110111b = 0f7h = 247 (base 10)
mov ecx, 0ffffffd3h ;ecx = 0ffffffd3h
movzx esi, bl ;copy bl to si and zero out upper part of esi
mov eax, esi ;move eax to esi
movzx esi, bh ;copy bh to si and zero out upper part of esi
add eax, esi ;add eax to esi
movzx esi, cx ;copy cx to si and zero out upper part of esi
add eax, esi ;add eax to esi
movzx esi, num1 ;copy num1 to si and zero out upper part of esi
add eax, esi ;add eax to esi
movzx esi, num2 ;copy num2 to si and zero out upper part of esi
add eax, esi ;add eax to esi
add eax, edx ;add eax to edx
这是对的吗?我不确定我是否假设使用mov或添加第一个(因为已经设置了eax),并且不确定我是否添加了正确的变量。
答案 0 :(得分:2)
我不确定我是否想要使用mov或者添加第一个(因为已经设置了eax),
第3部分非常清楚EAX的新值不依赖于旧值,因此movzx eax, bl
将是一个很好的开始方式。您的movzx
+ mov
版本有效但浪费了一条指令。
您的评论完全是多余的,并且不会在教学本身中添加任何新内容。老实说,这段代码并不真正需要评论,除了可能跟踪已经添加的内容,或只是对最终add
的评论。
; eax = bl + bh + ...
。
通常你的评论应至少比asm本身高一级抽象;描述算法以及asm如何实现它,而不是通过查看指令本身在指令参考手册中查找的内容。例如如果edx
持有您正在调用的值x_distance
,则可以在最后一个`add指令上发表; eax += x_distance
。
事实上,由于复制/粘贴太多,其中一条评论甚至不正确:
movzx esi, bh ;copy bh to si and zero out upper part of esi
如果您真的想以这种方式进行描述,则需要将bh
复制到sil
并将前3个字节归零。 (sil
是esi
的低字节,只能在x86-64模式下自行访问。)
但实际上你应该在写入完整的ESI之前将movzx
视为零扩展,这对性能有利,因为它不必与旧的合并值和然后零延伸;它只是将旧值替换为零扩展到32位的结果。