x86新增功能(添加)

时间:2017-08-17 02:15:25

标签: 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),并且不确定我是否添加了正确的变量。

1 个答案:

答案 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个字节归零。 (silesi的低字节,只能在x86-64模式下自行访问。)

但实际上你应该在写入完整的ESI之前将movzx视为零扩展,这对性能有利,因为它不必与旧的合并值和然后零延伸;它只是将旧值替换为零扩展到32位的结果。