【问题标题】:What does the syntax mean for declaring an array, and for calling functions?声明数组和调用函数的语法是什么意思?
【发布时间】:2016-04-04 19:14:31
【问题描述】:
  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. 这是一个有点乏味的问题,所以我提前道歉,但我根本不明白为什么下面代码示例中的大部分行都是必要的。假设我在 .data 部分有“prompt BYTE”行请输入一个值:“,0”,下面代码的每一行的目的是什么?注意:WriteString 和 ReadString 是在 Irvine 的库中定义的子程序,我正在使用。

    testOutput PROC
    
    push    edx
    push    ecx
    mov     edx,offset prompt
    call    WriteString
    pop     ecx
    pop     edx
    call    ReadString
    ret
    
    testOutput ENDP
    

【问题讨论】:

    标签: assembly x86 masm masm32 irvine32


    【解决方案1】:

    那里的 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
    

    【讨论】:

    • 小丑,你的回答确实提高了我对代码示例的理解,但我还有 2 个问题。对于第一个代码示例,当您说“保留”时,您的意思是设置数组中的索引数吗?所以“256 dup(?)”使得 SINTArray 有 256 个索引?另外,如果 dup 旁边的问号被替换为不同的字符(例如数字)会怎样?
    • 换句话说,它分配了一个 256 字节的数组,没有初始化为您关心的任何特定值。如果您确实关心,您当然可以给出该值而不是 ?
    • 哦,现在我明白了括号内的值是用来初始化存储在每个字节中的值。谢谢你的帮助,小丑。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-15
    • 1970-01-01
    • 1970-01-01
    • 2015-09-03
    相关资源
    最近更新 更多