语法对于声明数组和调用函数意味着什么?

时间:2016-04-04 19:14:32

标签: assembly x86 masm masm32 irvine32

  1. 对于我的第一个问题,我们假设我们在.data下面有以下代码行:

    "theSINTArray BYTE 256 dup(?)". 
    

    我知道这段代码会创建一个数组,其中每个元素必须是BYTE,但256和dup(?)是什么?

  2. 我知道下面的代码将SINTArray的类型,长度和偏移/地址推送到堆栈上,但我想知道的是,是否可以从堆栈中检索它们并在子程序。

    main PROC
    
    push    TYPE theSINTArray
    push    LENGTHOF theSINTArray
    push    OFFSET theSINTArray
    call    testParameters
    exit
    
    main ENDP
    
  3. 这是一个单调乏味的问题,所以我提前道歉,但我根本不明白为什么下面代码示例中的大部分行是必要的。假设我有一行"提示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
    

1 个答案:

答案 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