Я читал книгу «Программирование с нуля», чтобы научиться программировать на ассемблере в Linux. У меня возникли проблемы с решением одного из упражнений в конце главы 3. В упражнении предлагается изменить следующую программу, чтобы использовать адрес в конце набора данных для завершения цикла. Это просто простая программа для поиска максимального числа в наборе данных, в настоящее время она просто использует число ноль, чтобы отметить конец данных.
#PURPOSE: This program finds the maximum number of a
# set of data items.
#
#VARIABLES: The registers have the following uses:
#
# %edi -- Holds the index of the data item being examined
# %ebx -- Largest data item found
# %eax -- Current data item
#
# The following memory locations are used:
#
# data_items -- Contains the item data. A 0 is used
# to terminate the data.
#
.section .data
data_items:
.long 3, 67, 34, 14, 45, 75, 54, 187, 44, 87, 22, 11, 66, 0
.section .text
.globl _start
_start:
movl $0, %edi # Move 0 into the index register
movl data_items (, %edi, 4), %eax # Load the first byte of data
movl %eax, %ebx # The biggest
start_loop:
cmpl $0, %eax # Check to see if we've hit the end
je loop_exit
incl %edi # Load next value
movl data_items (, %edi, 4), %eax
cmpl %ebx, %eax # Compare values
jle start_loop # Jump to the beginning if new value
# Isn't larger
movl %eax, %ebx # Move the value as the largest
jmp start_loop # Jump to the beginning of loop
loop_exit:
# %ebx is the status code for the exit system call
# and it contains the maximum number
movl $1, %eax # 1 is the exit() system call
int $0x80
Я знаю, что могу просто жестко запрограммировать длину списка данных или сохранить ее в первом байте данных, но в упражнении предлагается завершить цикл, используя адрес последнего элемента. В книге упоминается использование символа для обозначения конца. Я думаю, что моя проблема в том, что я просто не понимаю, как получить адрес. Если бы я знал, как его получить, я мог бы просто сохранить его в реестре. Любая помощь приветствуется.