Linuxでのアセンブリプログラミングを学ぶために、「Programming fromtheGroundUp」という本を読んでいます。第3章の終わりにある演習の1つを解決するのに問題があります。演習では、次のプログラムを変更して、データセットの最後にあるアドレスを使用してループを終了するように指示しています。これは、データセット内の最大数を見つけるための単純なプログラムであり、現在、データの終わりを示すために数字のゼロを使用しています。
#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
データのリストの長さをハードコーディングするか、データの最初のバイトに格納できることはわかっていますが、演習では、最後の要素のアドレスを使用してループを終了するように求めています。この本は、終わりを示すために記号を使用することに言及しています。私の問題は、アドレスの取得方法がわからないことだと思います。入手方法を知っていれば、レジスターに保管することができます。どんな助けでも大歓迎です。