我最近一直在努力學習一些程序集,並且我目前難以找到一個需要我查找長整型值列表的最大數目的練習。程序集中長整型值列表的最大長度
的代碼如下:
.section .data
data_items: .long 200, 201, 101, 10, 0
min_val: .long 0x8000000000000000 # MIN_VALUE in long
.section .text
.global _start
_start:
movl $0, %edi # init counter to 0
movl min_val, %ebx
start_loop:
cmpl $0, %eax
je loop_exit # go to end if 0 encountered
incl %edi
movl data_items(,%edi,4), %eax
cmpl %ebx, %eax
jle start_loop # if new value < max value in ebx, read next element
movl %eax, %ebx
jmp start_loop
loop_exit:
movl $1, %eax
int $0x80
兩個問題代碼:
- 當試圖組裝的代碼,我得到的消息:警告:值0x8000000000000000截斷爲0x0
- 如果我用另一種邏輯(不需要min_value變量的)重寫我的代碼,任何值都大於data_items列表中的255會被截斷或返回值%256,即使
.long
的範圍應該大得多?
任何人都可以幫助我理解我做錯了什麼嗎?
編輯:更改後,代碼如下所示。注意最大在這種情況下如何原來是145,而不是401
.section .data
data_items: .long 401, 201, 101, 10, 0
max_val: .long 0x80000000
.section .text
.global _start
_start:
movl $0, %edi # init counter to 0
movl max_val, %ebx
start_loop:
movl data_items(,%edi,4), %eax
cmpl $0, %eax
je loop_exit # go to end if 0 encountered
incl %edi
cmpl %ebx, %eax
jle start_loop # if new value < max value in ebx, read next element
movl %eax, %ebx
jmp start_loop
loop_exit:
movl $1, %eax
int $0x80
我看到你的代碼在'%ebx'中放置了最大值,但是它對它做了什麼?如果程序沒有以任何方式返回,你如何確定最大值是145?也許你用來獲得結果的機制是怪罪。 – ugoren 2012-01-13 19:25:51
@ugoren:'%ebx'寄存器的內容默認用作可執行文件的返回碼。所以,我可以通過執行'。/ max'然後加'echo $?'來獲得最大值。 – sasuke 2012-01-13 19:30:32