NASM中的阵列基索引寻址

时间:2013-11-12 23:59:34

标签: arrays assembly x86 nasm

我正在尝试迭代定义的“2d”数组并找到最小值。

我在尝试访问矩阵内的值时遇到错误。 请注意,我已尝试更换:

mov ecx, matrix[edi + esi *2]

mov ecx, [matrix + edi + esi * 2]

并没有帮助

;-----------------------------------------------
;SECTION .DATA
;Instantiated variables/Constants
;-----------------------------------------------
section .data

result:     db "The smallest number is: " , 0x0a
result_len:     equ $-result

nl:     db "   ", 0x0a
nl_len  equ $-nl

matrix: dw  25, 24, 23, 22, 21
        dw  20, 19, 18, 17, 16 
        dw  15, 14, 13, 12, 11 
        dw  10,  9,  8,  7,  6
        dw   5,  4,  3,  2,  1


;-----------------------------------------------
;SECTION .BSS
;Non initialized variables
;-----------------------------------------------
section .bss


;-----------------------------------------------
;SECTION .TEXT
;Code
;-----------------------------------------------
section .text
global _start 

_start: 
    ;variable declaration
    mov edi, 0
    mov esi, 0
    mov ecx, 9

outerLoop:
    cmp edi, 50                  ;each element is 2 bytes (2 ascii characters)
    jg  endloop                  ;we need 50 because it's 5 elements per row
    mov esi, 0                   ;and 5 rows
innerLoop:
    cmp esi, 5                   ;Compare esi(inner loop index) to 5
    jge innerEnd                 ;jump if it reached the end of the row
    mov eax, matrix[edi + esi*2]
    cmp [eax], ecx
    jg  biggerThan
    mov ecx, [eax]
biggerThan:
    inc esi
    jmp innerLoop
innerEnd:
    add edi, 10                  ;row has been complete, go to next
    jmp outerLoop

endloop:
    push    ecx

    mov eax, 4
    mov ebx, 1
    mov ecx, result
    mov edx, result_len
    int 0x80

    mov eax, 4
    mov ebx, 1
    mov ecx, esp
    add [ecx], DWORD 48
    mov edx, 2
    int 0x80

    ; display new line
    mov eax, 4
    mov ebx, 1
    mov ecx, nl
    mov edx, nl_len
    int 0x80

 exit:
    mov eax, 1          ;eax contains 1 so quit
    mov ebx, 0
    int 0x80

如果有人可以解释为什么这一行

mov eax, matrix[edi + esi*2]

它不起作用或我应该怎么做 迭代数组并找到最小的数据,我很感激。

2 个答案:

答案 0 :(得分:1)

mov eax, matrix[edi + esi*2]
cmp [eax], ecx
jg  biggerThan
mov ecx, [eax]

Nasm想要方括号内的所有内存引用,所以mov eax, [matrix + edi + esi * 2]应该是正确的。但是你将4个字节从内存 - 你的两个值 - 移到eax。你只需要两个字节。但是,cmp [eax], ecx尝试将ecxeax中地址的内存进行比较,这几乎肯定不是有效的内存。你可能想要更像......的东西。

mov ax, [matrix + edi + esi*2]
cmp ax, cx
jg  biggerThan
mov cx, ax

您的显示例程仅适用于单个数字。由于矩阵中的最小值只是一个数字,因此这可能不会导致问题。

查看jgja之间的差异。您的值都是正数,因此您可能意味着将它们视为无符号 - ja是正确的。如果您建议允许负数,jg是正确的。如果你的价值是积极的并且小于2G也可以,但你也可以了解其中的差异。

你走在正确的轨道上!

答案 1 :(得分:0)

找到最小的是一个基本算法,只需将数组的初始值,放入“最小变量”然后比较下一个,如果下一个如果更小则将其保存到“最小变量”中,如果它不是,然后跳过它,然后进入数组中的下一个项目。

对于数组中的项目,您可能只是没有使用正确的内存地址。啊,汇编程序设计之美

相关问题