网页资讯视频图片知道文库贴吧地图采购
进入贴吧全吧搜索

 
 
 
日一二三四五六
       
       
       
       
       
       

签到排名:今日本吧第个签到,

本吧因你更精彩,明天继续来努力!

本吧签到人数:0

一键签到
成为超级会员,使用一键签到
一键签到
本月漏签0次!
0
成为超级会员,赠送8张补签卡
如何使用?
点击日历上漏签日期,即可进行补签。
连续签到:天  累计签到:天
0
超级会员单次开通12个月以上,赠送连续签到卡3张
使用连续签到卡
01月12日漏签0天
ubuntu吧 关注:143,633贴子:576,815
  • 看贴

  • 图片

  • 吧主推荐

  • 游戏

  • 4回复贴,共1页
<<返回ubuntu吧
>0< 加载中...

求解linux汇编,谁帮我看看错哪了,逻辑错误

  • 只看楼主
  • 收藏

  • 回复
  • 咎古0Hz
  • 铁杆吧友
    8
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
编译成功
链接成功
运行出错
Segmentation fault (core dumped)
这个程序是读取一个文件,把里面的小写字母变成大写字母。AT&T语法用as编译,ld链接的。
下面是我在终端的图
也许这个32位程序在我的X86_64有问题,有人能在32bit的linux系统下试一下么。

下面为源代码
****************************************************************
# 目的:本程序将输入的所有字母转化为大写字母
# 然后输出到输出文件
#
# 处理过程:(1)打开输入文本
# (2)打开输出文本
# (3)如果未达到输入文件的尾部:
# (a)将部分文件读入内存缓存区
# (b)读取内存缓存区的每个字节,如果该字节位小写字母,
# 将其转换为大写字母
# (c)将内存缓存区写入到输出文件中
#
.section .data
######常数######
# 系统调用号
.equ SYS_EXIT, 1
.equ SYS_READ, 3
.equ SYS_WRITE, 4
.equ SYS_OPEN, 5
.equ SYS_CLOSE, 6
# 文件打开选项
.equ O_RDONLY, 0
.equ O_CREAT_WRONLY_TRUNC, 03101
# 标准文件描述符
.equ STDIN, 0
.equ STDOUT, 1
.equ STDERR, 2
# 系统调用中断
.equ LINUX_SYSCALL, 0x80
.equ END_OF_FILE, 0# 这是读操作的返回值
# 表明到达文件结束处
.equ NUMBER_AGRUMENTS, 2
.section .bss
#缓冲区 - 从文件中将数据加载到这里
# 也要从这里将数据写入输出文件
# 由于各种原因,缓存区的大小不应
# 超过16000字节
.equ BUFFER_SIZE, 500
.lcomm BUFFER_DATA, BUFFER_SIZE
.section text
# 栈位置
.equ ST_SIZE_RESERVE, 8
.equ ST_FD_IN, -4
.equ ST_FD_OUT, -8
.equ ST_ARGC, 0# 参数数目
.equ ST_ARGV_0, 4# 程序名
.equ ST_ARGV_1, 8# 输入文件名
.equ ST_ARGV_2, 12# 输出文件名
.globl _start
_start:
###程序初始化###
# 保存栈指针
movl %esp, %ebp
# 在栈上为文件描述符分配空间
subl $ST_SIZE_RESERVE, %esp
open_files:
open_fd_in:
###打开输入文件###
# 打开系统调用
movl $SYS_OPEN, %eax
#将输入文件名放入`%ebx`
movl ST_ARGV_1(%ebp), %ebx
# 只读标志
movl $O_RDONLY, %ecx
movl $0666, %edx
# 调用Linux
int $LINUX_SYSCALL
store_fd_in:
# 保存给定的文件描述符
movl %eax, ST_FD_IN(%ebp)
open_fd_out:
###打开文件###
# 打开文件
movl $SYS_OPEN, %eax
#将输出文件名放入%ebx
movl ST_ARGV_2(%ebp), %ebx
# 写入文件标志
movl $O_CREAT_WRONLY_TRUNC, %ecx
# 新文件模式(如果已创建)
movl $0666, %edx
# 调用Liunx
int $LINUX_SYSCALL
store_fd_out:
# 这里存储文件描述符
movl %eax, ST_FD_OUT(%ebp)
###主循环开始###
read_loop_begin:
###从输入文件中读取一个诉据块###
movl $SYS_READ, %eax
#获取输入文件描述符
movl ST_FD_IN(%ebp), %ebx
movl $BUFFER_DATA, %ecx
movl $BUFFER_SIZE, %edx
# 读取缓冲区大小返回到%eax中
int $LINUX_SYSCALL
###如果到达文件末尾就退出###
# 读取缓冲区结束标志
cmpl $END_OF_FILE, %eax
# 如果发现文件结束符或者出错,就跳转到程序结束处
jle end_loop
continue_read_loop:
###将字符内容转化为大写形式###
pushl $BUFFER_DATA#缓存区位置
pushl %eax#缓冲区大小
call convert_to_upper
popl %eax#重新获得大小
addl $4, %esp
###将字符转化块写入输出文件###
# 缓冲区大小
movl %eax, %edx
movl $SYS_WRITE, %eax
# 要使用的文件
movl ST_FD_OUT(%ebp), %ebx
# 缓冲区位置
movl $BUFFER_DATA, %ecx
int $LINUX_SYSCALL
###循环继续###
jmp read_loop_begin
end_loop:
###关闭文件###
# 注意 - 这里我们无须进行错误检测
# 因为错误情况不代表任何特殊含义
movl $SYS_CLOSE, %eax
movl ST_FD_OUT(%ebp), %ebx
int $LINUX_SYSCALL
movl $SYS_CLOSE, %eax
movl ST_FD_IN(%ebp), %ebx
int $LINUX_SYSCALL
###退出###
movl $SYS_EXIT, %eax
movl $0, %ebx
int $LINUX_SYSCALL
# 目的: 这个函数实际上件字符块内容转化为大写字母
#
# 输入: 第一个参数是要转换内存块的位置
# 第二个参数是缓冲区的长度
#
# 输出: 这个函数以大写字符块覆盖当前缓冲区
#
# 变量:
# %eax - 缓冲区起始地址
# %ebx - 缓冲区长度
# %edi - 当前缓冲区偏移量
# %cl - 当前正在检测的字节
#
#
###常数###
# 我们搜索的下边界
.equ LOWERCASE_A, *a*
# 我们搜索的上边界
.equ LOWERCASE_Z, *z*
# 大小写转换
.equ UPPER_CONVERSION, *A* - *a*
###栈相关的信息###
.equ ST_BUFFER_LEN, 8 # 缓冲区长度
.equ ST_BUFFER, 12 # 实际缓冲区
convert_to_upper:
pushl %ebp
movl %esp, %ebp
###设置变量###
movl ST_BUFFER(%ebp), %eax
movl ST_BUFFER_LEN(%ebp), %ebx
movl $0, %edi
# 如果给定的缓冲区长度为0即离开
cmpl $0, %ebx
je end_convert_loop
convert_loop:
# 获取当前字节
movb (%eax,%edi,1), %cl
# 除非该字节字节在*a*和*z*之间,否则读取下一节
cmpb $LOWERCASE_A, %cl
jl next_byte
cmpb $LOWERCASE_Z, %cl
jg next_byte
# 否则将字节转化为大写字母
addb $UPPER_CONVERSION, %cl
# 并存回原处
movb %cl, (%eax,%edi,1)
next_byte:
incl %edi
cmpl %edi, %ebx
jne convert_loop
end_convert_loop:
# 无返回值,离开程序即可
movl %ebp, %esp
popl %ebp
ret


  • 咎古0Hz
  • 铁杆吧友
    8
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
自己顶起


2026-01-12 05:03:42
广告
不感兴趣
开通SVIP免广告
  • lxr
  • 铁杆吧友
    9
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
不懂汇编,但是你可能没有32位库
安装脚本
cd /etc/apt/sources.list.d;echo "deb http://old-releases.ubuntu.com/ubuntu raring main restricted universe multiverse" > ia32-libs-raring.list;apt-get update ;apt-get install ia32-libs;rm ia32-libs-raring.list;apt-get update


  • 贴吧用户_0QP2EKb
  • 意见领袖
    14
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼


登录百度账号

扫二维码下载贴吧客户端

下载贴吧APP
看高清直播、视频!
  • 贴吧页面意见反馈
  • 违规贴吧举报反馈通道
  • 贴吧违规信息处理公示
  • 4回复贴,共1页
<<返回ubuntu吧
分享到:
©2026 Baidu贴吧协议|隐私政策|吧主制度|意见反馈|网络谣言警示