这是一本书中的一段代码:
.data
count = 100
array WORD count DUP(?)
.code
push OFFSET array
push COUNT
call ArrayFill
ArrayFill PROC
push ebp
mov ebp, esp
pushad
mov esi, [ebp+12]
mov ecx, [ebp+8]
cmp ecx, 0
je L2
L1:
mov ecx, 1000h ; generate a random number within 0~FFFFh
call RandomRange ; comes from the book's lib
mov [esi], ax
add esi, TYPE WORD
loop L1
L2: popad
pop ebp
ret 8
ArrayFill ENDP
我对上面的代码有两个问题,
1)由于有pushad
和popad
,是否真的有必要写push ebp
和pop ebp
?
2)在L1
标签下方,我们不需要在之前和之后保存和恢复ecx
mov ecx, 1000h
call RandomRange
?
答案 0 :(得分:0)
1)您需要ebp
的正确值才能访问参数(ebp+xx
)。 ebp的值由esp
(push ebp; mov ebp, esp
)的特定值确定。在pushad
更改esp
的值后,您必须调整ebp+xx
的xx加法。你想这样做吗?稍后你想让MASM自动完成工作(ARG-directive),但是MASM只是插入相同的指令。
2)在你的书的例子中(我假设的欧文的装配书)写成:
" mov eax,10000h;随机0 - FFFFh" 。
EAX !不是ECX!您无法在不知道自己做什么的情况下更改寄存器。如果RandomRange
没有更改ECX,则您不需要保存它。