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