【问题标题】:Summing an array in assembly x86. On the inputted indexes在汇编 x86 中对数组求和。在输入的索引上
【发布时间】:2015-04-23 03:10:09
【问题描述】:

我在添加数组时遇到了一些麻烦,但在输入的索引上。例如,用户输入 4 作为开始数组,6 作为结束数组,所以我必须循环数组 [4] 到数组 [6] 并包含数字相加。我不确定我是否可以在我的 ArraySum 过程中的 .data 中使用我的数组。我必须以某种方式将其推入程序吗?

为此,我正在使用 Kip Irvine 的外部库。

我的代码在这里:

 TITLE Assignment 7

    INCLUDE Irvine32.inc


.data
str1 BYTE "The array sum is:    ",0
start BYTE "Enter the Starting Index:  ",0
endinx BYTE "Enter the Ending Index:    ",0

array DWORD 4, 6, 2, 5, 6, 7, 8, 4
sum DWORD ?
j DWORD ?
k DWORD ?

.code
main PROC
    mov esi, OFFSET array
    mov ecx, LENGTHOF array

    mov edx, OFFSET start
    call WriteString
    call ReadInt
    mov j, eax
    mov esi, j


    mov edx, OFFSET endinx
    call WriteString
    call ReadInt
    mov k, eax
    mov ecx, k

    call ArraySum
    mov sum,eax
    call WriteInt

main ENDP

;---------------------------------------------------
ArraySum PROC
;sums an array falling within j..k inclusive
;---------------------------------------------------
    push esi
    push ecx

    mov eax, 0
L1:
    add eax, array[esi]
    add esi, TYPE DWORD
    loop L1

    pop ecx
    pop esi
    ret

ArraySum ENDP

END main

【问题讨论】:

    标签: arrays assembly x86 masm irvine32


    【解决方案1】:

    从 ArraySum 访问 array 应该没有问题,但似乎循环的代码是错误的。 loop label 指令减少ecx 寄存器,如果ecx 不为零,它会跳转到标签。 array 还包含 DWORD,这意味着当您访问其元素时,您应该将索引乘以 4。 总的来说,循环的代码应该是这样的:

       ;; array max_index in ECX, i.e. length-1
        push ebx
        mov ebx, offset array
        xor  eax, eax                      ; sum = 0
        xor  esi, esi                      ; index = 0
    L1:                                    ; do {
        add eax, dword ptr [ebx + esi * 4]  ; sum += array[idx] scaled index addressing
        inc esi
        cmp esi, ecx
        jle L1                             ; }while(i <= max_idx)
    
        pop ebx
       ; EAX = sum of array[0 .. ecx*4]
    

    【讨论】:

      猜你喜欢
      • 2020-12-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-05
      • 1970-01-01
      • 2010-12-15
      • 1970-01-01
      相关资源
      最近更新 更多