我正在尝试迭代定义的“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]
它不起作用或我应该怎么做 迭代数组并找到最小的数据,我很感激。
答案 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
尝试将ecx
与eax
中地址的内存进行比较,这几乎肯定不是有效的内存。你可能想要更像......的东西。
mov ax, [matrix + edi + esi*2]
cmp ax, cx
jg biggerThan
mov cx, ax
您的显示例程仅适用于单个数字。由于矩阵中的最小值只是一个数字,因此这可能不会导致问题。
查看jg
和ja
之间的差异。您的值都是正数,因此您可能意味着将它们视为无符号 - ja
是正确的。如果您建议允许负数,jg
是正确的。如果你的价值是积极的并且小于2G也可以,但你也可以了解其中的差异。
你走在正确的轨道上!
答案 1 :(得分:0)
找到最小的是一个基本算法,只需将数组的初始值,放入“最小变量”然后比较下一个,如果下一个如果更小则将其保存到“最小变量”中,如果它不是,然后跳过它,然后进入数组中的下一个项目。
对于数组中的项目,您可能只是没有使用正确的内存地址。啊,汇编程序设计之美