Я недавно работал над изучением немного ассемблера, и в настоящее время я поставлен в тупик на упражнении, которое требует от меня найти максимальное количество в списке длинных значений.
Код выглядит следующим образом:
.section .data
data_items: .long 200, 201, 101, 10, 0
min_val: .long 0x8000000000000000 # MIN_VALUE in long
.section .text
.global _start
_start:
movl $0, %edi # init counter to 0
movl min_val, %ebx
start_loop:
cmpl $0, %eax
je loop_exit # go to end if 0 encountered
incl %edi
movl data_items(,%edi,4), %eax
cmpl %ebx, %eax
jle start_loop # if new value < max value in ebx, read next element
movl %eax, %ebx
jmp start_loop
loop_exit:
movl $1, %eax
int $0x80
Две проблемы с этим кодом:
- При попытке собрать код я получаю сообщение: Предупреждение: значение 0x8000000000000000 усечено до 0x0
- Если я переписываю свой код в альтернативной логике (та, которая не требует переменной min_value), любое значение больше 255 в списке data_items усекается или возвращается как значение% 256, даже если диапазон
.long
должен быть намного больше?
Может кто-нибудь помочь мне понять, что я делаю не так?
РЕДАКТИРОВАТЬ: После изменений код выглядит следующим образом. Обратите внимание, что максимум в этом случае оказывается 145 вместо 401.
.section .data
data_items: .long 401, 201, 101, 10, 0
max_val: .long 0x80000000
.section .text
.global _start
_start:
movl $0, %edi # init counter to 0
movl max_val, %ebx
start_loop:
movl data_items(,%edi,4), %eax
cmpl $0, %eax
je loop_exit # go to end if 0 encountered
incl %edi
cmpl %ebx, %eax
jle start_loop # if new value < max value in ebx, read next element
movl %eax, %ebx
jmp start_loop
loop_exit:
movl $1, %eax
int $0x80