【问题标题】:Why i can't add in the array?为什么我不能添加到数组中?
【发布时间】:2020-12-02 18:12:43
【问题描述】:

我正在尝试将值添加到数组中,而不是进行平均。 但我注意到,当我求和时,数组中的值没有通过 256。

SECTION .data   ;data section

array:      db  15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15
SIZE        EQU 20
    

;sum all positions of vector, length of 20

SECTION .text         ;code section

    global _start
    
    _start:

        xor bl,bl
        xor ecx,ecx
        jmp for_cond        
        
for_body:
        mov al,[array+ECX]
        add bl,al   
        inc ecx

for_cond:
        cmp ecx,SIZE
        jl  for_body    
        

        mov eax,1   ; exit command to kernel
        int 0x80    ; interrupt 80 hex, call kernel

【问题讨论】:

    标签: assembly x86 nasm


    【解决方案1】:

    您尝试将整个总和添加到 BL 寄存器中 - 它只有 8 位宽,因此最多只能数到 255。您最好将主循环更改为

    for_body:
        movzx ax, byte [array+ECX]
        add   bx, ax   
        inc   ecx
    

    这将实现使用最多可计数为 65535 的 16 位寄存器。MOVZX 指令会将您的 8 位值从内存扩展为 AX 中的 16 位值。然后,您可以使用像 BX 这样的 16 位寄存器来用于最后除以元素数量(保留在 CX 或常量 SIZE 中)。

    注意:
    如果您使用有符号数字而不是无符号数字,则必须将 MOVZX 替换为 MOVSX

    【讨论】:

    • 我将尝试将值放入 16 位寄存器,谢谢。我忘了放标签 for_cond,但只有 cmp ecx 与 SIZE 和 jl for_body
    • 那很好。如需进一步帮助,请尝试将您的代码设为minimal reproducible example。请相应地edit您的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-05
    • 1970-01-01
    • 1970-01-01
    • 2021-09-21
    • 2014-05-19
    • 2011-01-30
    相关资源
    最近更新 更多