Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 程序集中长值列表的最大值_Linux_Assembly - Fatal编程技术网

Linux 程序集中长值列表的最大值

Linux 程序集中长值列表的最大值,linux,assembly,Linux,Assembly,我最近一直在努力学习一点汇编,目前我正在做一个练习,要求我找到长值列表的最大值 代码如下: .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

我最近一直在努力学习一点汇编,目前我正在做一个练习,要求我找到长值列表的最大值

代码如下:

.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

首先,0x80000000000000甚至不适合长型,这是一个长型。长-1是0xffffffff


至于另一点,我不能对您尚未发布的代码发表评论。

非常感谢您的回复。两个问题:
long
数据类型是否通常为64位,如
double
?另外,我在结尾添加了一个新的代码段来突出显示第二条注释。long是qword,64位。您正在编写32位代码,并且您的指令都很长。代码对我来说似乎很好,退出状态代码是8位的,因此它们是256模。我看到您的代码将最大值放在
%ebx
中,但它对它有什么作用?如果程序没有以任何方式返回,如何确定最大值为145?可能是您用来获取结果的机制造成的。@ugoren:ebx寄存器的内容默认用作可执行文件的返回代码。因此,我可以通过执行
/max
然后执行
echo$?
来获得最大值。
.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