xgmlovebee 发表于 2004-11-12 15:21:31

一个奇怪的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

bing 发表于 2004-11-13 22:01:56

输出有没有处理好。一般输出为ASCII码,只是八位的。你还要对数字进行处理才可以输出
看不明AT&T的汇编,只是给个意见。说错不要怪

sd_2001 发表于 2004-11-15 21:07:21

我说一句,

不知是我记错了还是什么, 看上去好象你的这段程序好象没有输出部分.

只是求出了最大值(%ebx), 系统调用#1好象是exit调用吧.

用库函数输出看看.

outmsg:
.asciz "Max : %d\n"

pushl %ebx
pushl $outmsg
call _printf
addl $8, %esp

movl $1, %eax
int $0x80

crquan 发表于 2004-11-30 14:52:38

不知 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]
查看完整版本: 一个奇怪的ATamp;T汇编的现象,望大虾帮忙解释一下