Здравствуйте, я новичок в ассемблере. Я читаю книгу, чтобы улучшить свои знания (программирование с нуля).
Я понимаю, что в следующем примере возникает вопрос, который требует изменить программу и заставить ее остановиться, когда достигнет конечного адреса. Я не знаю, как напечатать текущий адрес в сборке или сравнить его с номером. И правильно ли использовать cmpl $13, %edi
, чтобы определить, когда был достигнут конец data_items
?
.section .data
data_items: #These are the data items
.long 3,67,34,222,45,75,54,34,44,33,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 # since this is the first item, %eax is
# the biggest
start_loop: # start loop
#cmpl $22, %eax # check to see if we’ve hit the end using Value
#cmpl $13, %edi # Using Length to break loop
#I have to add a condition here to use an ending address
#rather than the number 0 to know when to stop.
je loop_exit
incl %edi # load next value
movl data_items(,%edi,4), %eax
cmpl %ebx, %eax # compare values
jle start_loop # jump to loop beginning if the new
# one isn’t bigger
movl %eax, %ebx # move the value as the largest
jmp start_loop # jump to loop beginning
loop_exit:
# %ebx is the status code for the exit system call
# and it already has the maximum number
movl $1, %eax #1 is the exit() syscall
int $0x80