一个奇怪的ATamp;T汇编的现象,望大虾帮忙解释一下
我在运行AT&T汇编的示例程序,遇到这样的现象:求一堆数中的最大数,我发现当数小于255时,显示结果正常,如222
但是当数据大于255时,会自动对此数取256的模,如最大数是256,结果是0,890时结果是122,我很不解,为什么??????/
.section .data
data_items:
.long 3,67,34,242,255,25,54,34,890,22,66,11,0
.section .text
.globl _start
_start:
movl $0,%edi
movl data_items(,%edi,4),%eax
movl %eax,%ebx
start_loop:
cmpl $0,%eax
je loop_exit
incl %edi
movl data_items(,%edi,4),%eax
cmpl %ebx,%eax
jle start_loop
movl %eax,%ebx
jmp start_loop
loop_exit:
movl $1,%eax
int $0x80 输出有没有处理好。一般输出为ASCII码,只是八位的。你还要对数字进行处理才可以输出
看不明AT&T的汇编,只是给个意见。说错不要怪 我说一句,
不知是我记错了还是什么, 看上去好象你的这段程序好象没有输出部分.
只是求出了最大值(%ebx), 系统调用#1好象是exit调用吧.
用库函数输出看看.
outmsg:
.asciz "Max : %d\n"
pushl %ebx
pushl $outmsg
call _printf
addl $8, %esp
movl $1, %eax
int $0x80
不知 lt;lt;8 是何意呢?
你的代码是将找出的最大数放在 ebx 中,用 eax = 1 作 exit 调用,然后用 echo $? 检查退出错误码吧?事实上, exit 调用只取 bl 中的值有效,也就是一个字节数,可以用 C 代码
exit(257);
检查,echo $? 值为 1
如楼上用 printf 打印就不会有问题的。
见内核 kernel/exit.c 代码:
asmlinkage long sys_exit(int error_code)
{
return do_exit((error_code&0xff)<<8);
}
不知 <<8 是何意呢?
页:
[1]