gpt4 book ai didi

linux - 获取一组数据末尾的地址?

转载 作者:IT王子 更新时间:2023-10-29 01:23:57 25 4
gpt4 key购买 nike

我一直在阅读“从头开始编程”一书来学习 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

我知道我可以只对数据列表的长度进行硬编码,或者我可以将它存储在数据的第一个字节中,但是练习要求使用最后一个元素的地址来终止循环。书中提到使用符号来标记结束。我认为我的问题是我只是不明白如何获取地址。如果我知道如何得到它,我可以将它存储在寄存器中。感谢您的帮助。

最佳答案

针对 Mac OSX 进行了一些小修改...

.data

data_items:
.long 3, 67, 34, 14, 45, 75, 54, 187, 44, 87, 22, 11, 66, 0
data_end:

.text

.globl start
start:
movl $0, %edi # Move 0 into the index register
movl data_items (, %edi, 4), %eax # Load the first data value
movl %eax, %ebx # The biggest
leal data_end, %ecx # Load and save ending address

start_loop:
leal data_items(, %edi, 4), %eax # Get address of next value
cmpl %eax, %ecx # Check to see if we've hit the end
je loop_exit
incl %edi # Increment index
movl (%eax), %eax # Load value
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:
movl $1, %eax # 1 is the exit() system call
pushl %ebx
pushl $0

int $0x80

关于linux - 获取一组数据末尾的地址?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12874611/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com