2012-01-13 57 views
1

我最近一直在努力學習一些程序集,並且我目前難以找到一個需要我查找長整型值列表的最大數目的練習。程序集中長整型值列表的最大長度

的代碼如下:

.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 
+0

我看到你的代碼在'%ebx'中放置了最大值,但是它對它做了什麼?如果程序沒有以任何方式返回,你如何確定最大值是145?也許你用來獲得結果的機制是怪罪。 – ugoren 2012-01-13 19:25:51

+1

@ugoren:'%ebx'寄存器的內容默認用作可執行文件的返回碼。所以,我可以通過執行'。/ max'然後加'echo $?'來獲得最大值。 – sasuke 2012-01-13 19:30:32

回答

2

首先,0x8000000000000000甚至不適合在相當長的,這是一個長長。長-1是0xffffffff

至於另一點,我不能評論你沒有發佈的代碼。

+0

非常感謝您的回覆。兩個問題:不是'long'數據類型通常是64位,比如'double'?另外,我在最後添加了一個新的代碼片段來突出第二個評論。 – sasuke 2012-01-13 19:16:43

+0

不,* long *是雙字,32位。 * long long *是qword,64位。您正在編寫32位代碼,並且您的指令都是_l_ong。代碼似乎對我來說很好,退出狀態代碼是8位,所以它們是模256. – 2012-01-14 05:29:27

+0

啊謝謝,這清除了事情。公認! – sasuke 2012-01-14 07:31:28