【问题标题】:Creating array and adding values创建数组并添加值
【发布时间】:2017-04-25 01:11:32
【问题描述】:

所以我正在处理一项任务,我在理解这种类型的代码中的数组时遇到了一些问题(请记住,我对这些东西的了解有限)。我的代码应该要求用户输入将放入 SDWORD 数组中的值的数量,然后创建一个让用户输入数字的过程。我在下面完成了向用户询问金额(保存在“计数”中)的部分,但我正在努力处理其他程序部分例如,如果他们输入 5,则使用下面的代码,那么我必须执行的程序将需要他们输入 5 个数字,这些数字将进入一个数组。

我面临的问题是我不确定如何实际设置阵列。它可以包含 2 到 12 个数字之间的任何数字,这就是我在下面的代码中设置比较的原因。例如,假设用户输入他们将输入 5 个数字,我将其设置为这样......

.data
array SDWORD 5

我遇到的问题是我不确定这是说数组将保存 5 个值还是数组中只有一个值是 5。我需要数组中的值等于“数数”。我在下面设置的“计数”是用户要输入的数量。

我显然也知道如何设置这样的程序......

EnterValues PROC

    return
EnterValues ENDP    

我只是不知道如何实现这样的东西。我在网上所做的所有研究只会让我更加困惑,而且我发现的所有示例都没有要求用户在实际输入任何数字之前输入数组中有多少个数字。我希望我所描述的有道理。任何关于我可能做的事情都会很棒!

INCLUDE Irvine32.inc
.data
count SDWORD ?
prompt1 BYTE "Enter the number of values to sort",0
prompt2 BYTE "Error. The number must be between 2 and 12",0

.code

Error PROC
    mov edx, OFFSET prompt2
    call WriteString
    exit         ; exit ends program after error occures
Error ENDP

main PROC
    mov edx, OFFSET prompt1
    call WriteString    ; prints out prompt1
    call ReadInt
    mov count, eax     ; save returned value from eax to count

    cmp count, 12     
    jle Loop1       ; If count is less than or equal to 12 jump to Loop1, otherwise continue with Error procedure
    call Error      ; performs Error procedure which will end the program

    Loop1: cmp count, 2
    jge Loop2    ; If count is greater than or equal to 2 jump to Loop2, otherwise continue with Error procedure
    call Error   ; performs Error procedure which will end the program

     Loop2: exit
main ENDP
END main

============编辑===============

我想出了这个...

EnterValues PROC
    mov ecx, count
    mov edx, 0
    Loop3: 
       mov eax, ArrayOfInputs[edx * 4] 
       call WriteInt
       call CrLf 
       inc edx 
       dec ecx 
       jnz Loop3
    ret
EnterValues ENDP

【问题讨论】:

    标签: visual-studio-2010 assembly masm irvine32


    【解决方案1】:
    .data
    array SDWORD 5
    

    DATA 部分定义one SDWORD,初始值为5,并将其命名为“array”。

    您可能想使用DUP operator

    .data
    array SDWORD 12 DUP (5)
    

    这定义了 12 个 SDWORD 并用值 5 初始化它们中的每一个。如果初始值无关紧要,即您想要一个未初始化的数组,请将初始值更改为 '?':

    array SDWORD 12 DUP (?)
    

    MASM 现在可以创建_BSS segment。强制决定:

    .data?
    array SDWORD 12 DUP (?)
    

    符号array 在 MASM 程序中用作第一个条目地址的常量偏移量。使用附加索引来处理后续条目,例如:

    mov eax, [array + 4]    ; second SDWORD
    mov eax, [array + esi]
    

    指针运算:

    lea esi, array          ; copy address into register
    add esi, 8              ; move pointer to the third entry
    mov eax, [esi]          ; load eax with the third entry
    
    lea esi, array + 12     ; copy the address of the fourth entry
    mov eax, [esi]          ; load eax with the fourth entry
    

    在每种情况下,您都有一个固定大小的数组。由您决定,只需填写 count 值即可。

    【讨论】:

    • 非常感谢!我最终想出了一些东西,并将其添加到问题的末尾。你介意看看它并让我知道它是否有意义吗?谢谢!
    • 另外我想让你知道我将数组的名称更改为 ArrayOfInputs 所以这就是它不同的原因
    • @V.Valdes:是的,这是有道理的,而且风格很好:源于程序,结构清晰(没有意大利面条),有意义的符号名称,格式良好,
    • @V.Valdes:啊,一件事,看着this question。程序EnterValues 应该“输入”一些东西。目前它只显示数组的值。看Irvine's ReadInt
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多