对于我的第一个问题,我们假设我们在.data下面有以下代码行:
"theSINTArray BYTE 256 dup(?)".
我知道这段代码会创建一个数组,其中每个元素必须是BYTE,但256和dup(?)是什么?
我知道下面的代码将SINTArray的类型,长度和偏移/地址推送到堆栈上,但我想知道的是,是否可以从堆栈中检索它们并在子程序。
main PROC
push TYPE theSINTArray
push LENGTHOF theSINTArray
push OFFSET theSINTArray
call testParameters
exit
main ENDP
这是一个单调乏味的问题,所以我提前道歉,但我根本不明白为什么下面代码示例中的大部分行是必要的。假设我有一行"提示BYTE"请输入一个值:",0"在.data部分,下面代码的每一行的目的是什么?注意:WriteString和ReadString是Irvine的库中定义的子例程,我正在使用它。
testOutput PROC
push edx
push ecx
mov edx,offset prompt
call WriteString
pop ecx
pop edx
call ReadString
ret
testOutput ENDP
答案 0 :(得分:4)
那里有256和dup(?)是什么?
阅读assembler's manual。 TL; DR:保留256个未初始化的字节
如果可以从堆栈中检索它们并使用它们 在子程序中
当然有可能,如果被调用者无法访问参数,则参数传递将是愚蠢的;)您相对于esp
(堆栈指针)解决它们,或者,在您将其设置为帧指针ebp
。示例:[esp+4]
或[ebp+8]
。
下面代码的每一行的目的是什么
testOutput PROC ; begin testOutput procedure
push edx ; save edx on stack
push ecx ; save ecx on stack
mov edx,offset prompt ; load edx with address of prompt
; presumably argument to WriteString
call WriteString ; invoke WriteString procedure
pop ecx ; restore ecx saved above
; in case WriteString modified it
pop edx ; restore edx saved above (we have modified it)
call ReadString ; invoke ReadString procedure
ret ; return from subroutine
testOutput ENDP ; end of procedure