查看书中的代码时会感到困惑

时间:2014-05-02 08:09:51

标签: assembly

这是一本书中的一段代码:

.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)由于有pushadpopad,是否真的有必要写push ebppop ebp

2)在L1标签下方,我们不需要在之前和之后保存和恢复ecx mov ecx, 1000h
call RandomRange

1 个答案:

答案 0 :(得分:0)

1)您需要ebp的正确值才能访问参数(ebp+xx)。 ebp的值由esppush ebp; mov ebp, esp)的特定值确定。在pushad更改esp的值后,您必须调整ebp+xx的xx加法。你想这样做吗?稍后你想让MASM自动完成工作(ARG-directive),但是MASM只是插入相同的指令。

2)在你的书的例子中(我假设的欧文的装配书)写成:
" mov eax,10000h;随机0 - FFFFh"
EAX !不是ECX!您无法在不知道自己做什么的情况下更改寄存器。如果RandomRange没有更改ECX,则您不需要保存它。