QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 1262|回复: 3

一个奇怪的ATamp;T汇编的现象,望大虾帮忙解释一下

[复制链接]
发表于 2004-11-12 15:21:31 | 显示全部楼层 |阅读模式
我在运行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
发表于 2004-11-13 22:01:56 | 显示全部楼层
输出有没有处理好。一般输出为ASCII码,只是八位的。你还要对数字进行处理才可以输出
看不明AT&T的汇编,只是给个意见。说错不要怪
回复

使用道具 举报

发表于 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
回复

使用道具 举报

发表于 2004-11-30 14:52:38 | 显示全部楼层

不知 lt;lt;8 是何意呢?

你的代码是将找出的最大数放在 ebx 中,用 eax = 1 作 exit 调用,然后用 echo $? 检查退出错误码吧?

事实上, exit 调用只取 bl 中的值有效,也就是一个字节数,可以用 C 代码
[code:1]
 exit(257);
[/code:1]
检查,echo $? 值为 1
如楼上用 printf 打印就不会有问题的。

见内核 kernel/exit.c 代码:
[code:1]
asmlinkage long sys_exit(int error_code)
{
        return do_exit((error_code&0xff)<<8);
}
[/code:1]
不知 <<8 是何意呢?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-11-16 09:58 , Processed in 0.041537 second(s), 16 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表