x86新手入门(添加)
问题描述:
任何人都可以仔细检查这一点,看看我是否做得对吗?x86新手入门(添加)
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已经设置),并且不确定是否添加了正确的变量。
答
我不知道如果我想使用MOV或添加的第一个(因为EAX已经被设置),
第3部分是很清楚,EAX的新值不依赖于旧的价值,所以movzx eax, bl
将是一个很好的开始。您的movzx
+ mov
版本可行,但会浪费指令。
您的意见完全是多余的,并且不会添加任何尚未在指令本身中的新内容。老实说,这段代码并不真正需要评论,除了可能跟踪已经添加的内容,或者只是对最终add
发表评论; eax = bl + bh + ...
。
通常情况下,您的评论应该至少比抽象层级本身更高的抽象层次;描述算法以及asm如何实现它,而不是从指令参考手册中查看指令本身的内容。例如如果edx
所持有的值是您呼叫的x_distance
,那么您可以在最后一条“添加指令”中注释; eax += x_distance
。
事实上,一个评论是不正确的,甚至,因为太多的复制/粘贴:
movzx esi, bh ;copy bh to si and zero out upper part of esi
如果你真的想描述这种方式,你复制bh
到sil
和调零高3个字节。 (sil
是esi
的低字节,只能在x86-64模式下自行访问)。
不过说真的,你应该想到movzx
像以前写作充分ESI,这是良好的性能,因为它不具有与旧值合并和零扩展然后零扩展;它只是将零值扩展到32位的结果替换旧值。
你想检查你的作业吗? –
那么......你写的代码是在哪里做的?如果您希望我们检查它,那将是一个先决条件,我会想象:-) – paxdiablo
当您评估第3部分中的表达式时,是否应该在不截断临时结果的情况下执行此操作?或者它应该是'uint8_t(bl + bh)+ uint16_t(cx)'+ ... ie你应该首先将所有那些窄输入扩展到32或64位,或者以'add bl,bh '? –