2012-10-13 24 views
2

我一直在阅读“从头开始编程”一书,在Linux中学习汇编编程。我在第三章末尾解决了其中一个练习时遇到了问题。 练习说修改下面的程序,使用数据集末尾的地址来终止循环。这只是一个简单的程序,用于查找一组数据中的最大数量,它目前仅使用数字零来标记数据的结尾。获取一组数据末尾的地址?

#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 

我知道,我可能只是硬编码数据的列表的长度,我也可以将其存储在数据的第一个字节,但锻炼是要求使用的地址,以终止循环最后的元素。这本书提到使用符号来标记结尾。我认为我的问题是我不明白如何获得地址。如果我知道如何得到它,我可以把它存储在一个寄存器中。任何帮助表示赞赏。

回答

0

问问自己:我知道数据的起始地址吗?我怎么知道它?我知道数据的大小吗?我怎么知道这个?我能从这些信息中了解结束地址吗?

+0

这是我遇到的麻烦是最后一个问题。 –

+0

如果您知道起始地址,数据中的项目数量以及您灵魂能够计算结束地址的每个元素的大小,如果你知道如何声明标签,你可以更容易,也许你可以在最后一个元素附近声明一个标签? –

2

随着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