AT&T汇编、调用C库函数、读/写文件

d0321:更新读文件代码(图片)以后会更新代码版。

d0329:汇编文本读取、简单动画。

================================================

本文是利用AT&T风格调用C库,来读取文件内容。(如果安装的是64位的linux,需要安装32位的C库。并在利用gcc编译的时候加入-m32指令。)

64位利用32位库的编译指令如下:(-ggdb是加入gdb调试信息)

gcc -m32 -ggdb readfile.s -o readfile
  • 利用C库函数fscanf读文件













  • GDB调试代码

    • 查看寄存器中的值
        info reg

    • 查看内存中的值
        x/nfu <addr>
    • n表示要显示的内存单元的个数。
    • f表示显示方式, 可取如下值:

      x 按十六进制格式显示变量。 d 按十进制格式显示变量。

      u 按十进制格式显示无符号整型。 o 按八进制格式显示变量。

      c 按字符格式显示变量。f 按浮点数格式显示变量。
    • u表示一个地址单元的长度,可取下值

      b表示单字节,h表示双字节,w表示四字节,g表示八字节。

  • 汇编语言完成简单文本动画

在实现了基本的文件读取功能后,利用汇编语言制作了简单的动画(用空格实现)

该程序的基本流程如下:

.code32
.section .rodata #参数定义
mode:
.string "r"
sreturn:
.string "Read file success"
freturn:
.string "Read file failed"
space:
.string " "
printstring:
.string "%s"
colorRed:
.string "\033[31m"
colorYellow:
.string "\033[33m"
colorGreen:
.string "\033[36m"
nomalEnd:
.string "\033[0m"
colorType:
.string "%s%s%s"
clear:
.string "clear"
tmp:
.string "@" #代码部分
.text #animation
.globl animation
.type animation, @function
animation:
pushl %ebp
movl %esp, %ebp subl $200, %esp #设置该函数的栈区为ebp-200
xorl %eax, %eax #clear %eax
movl $0,-108(%ebp) #设置刷新10次 file_open:
pushl $mode #将文件读取模式压入栈
pushl 8(%ebp)
call fopen
addl $8, %esp #清除上面压栈的mode和path check_open:
cmpl $0, %eax #eax中接着的是返回值
je read_fail #如果无法读取就跳转 read_sus:
movl %eax, -104(%ebp) #将文件指针保存在-104 pushl $sreturn #输出成功读取文件提示
call puts
addl $4, %esp #清除上面压栈的sreturn pushl $clear #将clear指令压栈
call system #调用system系统函数,用来清屏
addl $4,%esp #清除上面压栈的一个参数 read_one_line:
pushl -104(%ebp) #这里是把ebp-104里面存的的值压进去(fp)
pushl $200 #将fgets的第二个参数压栈
leal -100(%ebp), %eax #将从文件中读取的数据保存到ebp-100
pushl %eax #这里是把ebp-100的这个值(地址压进去)
call fgets
addl $12, %esp #清除压栈参数 check_EOF:
pushl -104(%ebp) #这里是把ebp-104里面存的的值压进去(fp)
call feof
addl $4, %esp #清除上面压栈的一个参数
cmpl $0,%eax #判断返回值
jne close_file movl -108(%ebp),%ebx #将刷新参数读到ebx
print_space: #pushl $tmp
#call printf
#addl $4,%esp cmpl $0,%ebx
je print_text #如果已经打印完了就开始输出数据
pushl $space #打印空格
pushl $printstring
call printf
addl $8,%esp #清理压栈
subl $1,%ebx #循环参数减一
jmp print_space print_text:
leal -100(%ebp), %eax #将刚才读出来的数据压栈,准备输出
pushl $nomalEnd
pushl %eax
pushl $colorYellow
pushl $colorType
call printf
addl $4, %esp #清除上面压栈的一个参数
jmp read_one_line close_file:
pushl -104(%ebp) #把文件指针压栈
call fclose #关闭文件
addl $4, %esp #清除上面压栈的一个参数 movl $0, -104(%ebp) #清空文件指针 movl -108(%ebp),%ebx #当缓冲空格已经结束
cmp $30,%ebx
je end_main addl $1,%ebx #刷新剩余次数加一
movl %ebx,-108(%ebp) #保存起来
pushl $80000 #sleep参数
call usleep
pushl $clear #清屏
call system
addl $8,%esp
jmp file_open read_fail:
pushl $freturn #输出读取失败文件提示
call puts
addl $4, %esp #清除上面压栈的一个参数 end_main:
leave
ret #main
.section .rodata
welcomemsg:
.string "================================================================\n Welcome!\n Please Input the filename you wantta play!\n================================================================\n"
askagain:
.string "again?(y/n)"
stringType:
.string "%s"
yes:
.string "y"
no:
.string "n"
inttype:
.string "%d"
.globl main
.type main, @function main:
pushl %ebp
movl %esp, %ebp subl $50,%esp #主函数栈区 pushl $welcomemsg
call printf
addl $4,%esp leal -4(%ebp),%eax #输入文件路径
pushl %eax
pushl $stringType
call scanf
addl $8,%esp start:
leal -4(%ebp),%eax
pushl %eax
call animation #播放开启动画
addl $4,%esp ask:
pushl $askagain #again?
call printf
addl $4,%esp leal -14(%ebp), %eax #y/n
pushl %eax
pushl $stringType
call scanf
addl $8, %esp subl $16, %esp #is y?
leal -14(%ebp), %eax
pushl %eax
pushl $yes
call strcmp
addl $24, %esp
cmpl $0,%eax
je start subl $16, %esp #is n?
leal -14(%ebp), %eax
pushl %eax
pushl $no
call strcmp
addl $24, %esp
cmpl $0,%eax
je endmain
jmp ask endmain:
leave
ret

运行截图:(其中1文件见下)



为动画效果,不好截图,可以将源码拷贝运行一次。

文件1

           ###########
# #
# #
### # # ###
# # # # # #
# #
# #
# #
#############################

文件2

====    ====    ====    ||||
==== ==== ==== ||||
==== ==== ||||
==== ==== ==== ||||
============ ==== ||||
============ ==== ||||
==== ==== ====
==== ==== ==== ||||
==== ==== ==== ||||

AT&T汇编语言学习:利用c库、文件读写的更多相关文章

  1. 孙鑫MFC学习笔记12:文件读写

    1.指向常量的指针 2.指针常量 3.C语言对文件操作是在缓冲区,在缓冲区满或文件关闭时写入文件 读取相同 4.fflush刷新缓冲区,使缓冲区数据写入文件 5.fseek改变文件指针偏移量 6.st ...

  2. iOS学习35数据处理之文件读写

    1. 沙盒机制 1> 沙盒概述 每一个iOS应用程序都会为自己创建一个文件系统目录(文件夹), 这个独立.封闭.安全的空间,叫做沙盒 注:① 每一个应用程序都会拥有一个应用程序沙盒 ② 应用程序 ...

  3. No.20 selenium学习之路之文件读写

    1.open 使用open打开文件后一定要记得调用文件对象的close()方法.比如可以用try/finally语句来确保最后能关闭文件. file_object = open('thefile.tx ...

  4. 利用C#进行文件读写的方法选择总结

    小的文本文件(100M以下)直接用File类的ReadAllText()和WriteAllText()方法 这两个方法内部其实就是封装了StreamReader类的ReadToEnd()和Stream ...

  5. python学习之输出与文件读写

    #1. 打印字符串print ("His name is %s"%("Aviad")) #2.打印整数print ("He is %d years o ...

  6. ecCodes 学习 利用ecCodes Python API对GRIB文件进行读写

    参考 https://www.ecmwf.int/assets/elearning/eccodes/eccodes2/story_html5.htmlhttps://confluence.ecmwf. ...

  7. c# 利用动态库DllImport("kernel32")读写ini文件(提供Dmo下载)

    c# 利用动态库DllImport("kernel32")读写ini文件 自从读了设计模式,真的会改变一个程序员的习惯.我觉得嘛,经验也可以从一个人的习惯看得出来,看他的代码编写习 ...

  8. ecCodes 学习 利用ecCodes fortran90 api对GRIB文件进行读写

    参考 https://www.ecmwf.int/assets/elearning/eccodes/eccodes2/story_html5.htmlhttps://confluence.ecmwf. ...

  9. php学习笔记:利用gd库生成图片,并实现随机验证码

    说明:一些基本的代码我都进行了注释,这里实现的验证码位数.需要用的字符串都可以再设置.有我的注释,大家应该很容易能看得懂. 基本思路: 1.用mt_rand()随机生成数字确定需要获取的字符串,对字符 ...

  10. 利用Visual Studio寻找C#程序必要的运行库文件

    在工程打包中,有时候很头痛的就是运行所需要的库文件不能够全面的包含进来,特别是有时候调用了一系列外部扩展.对于这些问题,我们可以借用Visual Studio的打包功能帮助我们寻找软件运行必须的库文件 ...

随机推荐

  1. acdsee-pro-8 英文版

    目前中文版acdsee pro 8不支持破解,只能选择英文版,然后汉化. 但是英文版并不好找,我在这里分享一下. 下载地址:http://pan.baidu.com/s/1boNZxQf 同时附上注册 ...

  2. Fail2防止sshd暴力破解

    简介: fail2ban是一款实用软件,可以监视你的系统日志,然后匹配日志的错误信息(正则式匹配)执行相应的屏蔽动作.支持大量服务.如sshd,apache,qmail,proftpd,sasl等等 ...

  3. NYOJ--114--某种序列(大数)

    某种序列 时间限制:3000 ms  |  内存限制:65535 KB 难度:4   描述 数列A满足An = An-1 + An-2 + An-3, n >= 3 编写程序,给定A0, A1 ...

  4. CSDN社区投诉申请表

    最近两天我发现我的个人网站,业余草:www.xttblog.com,流量急速下滑.经过分析,发现是被CSDN社区的一个博客网友将我网站上的内容搬到了他的CSDN博客上.导致了已搜索就全部导流到了CSD ...

  5. Oracle impdp通过network_link不落地方式导入数据

    --Oracle impdp通过network_link不落地方式导入数据 -----------------------------------------------------2014/01/1 ...

  6. 解决Coursera视频无法观看

    修改电脑的 C:\Windows\System32\drivers\etc 目录下的host文件, 在最后添加一行: 52.84.246.72 d3c33hcgiwev3.cloudfront.net

  7. XSS编码初析

    首先我们应当了解,当我们发送一个请求链接时,服务器与客户端都发生了什么 这里仅涉及到js的编码问题,因此就编码来说,首先我们确定我们发出的请求是采用GET的方式还是采用POST的方式 若采用GET的方 ...

  8. PCA主成分分析

    特征降维就是降低特征矩阵维数,减少噪声和冗余,减少过度拟合. Principal factor analysis简称PCA,其思想是将n维特征映射到k维上(k<n),这k维是全新的正交特征.这k ...

  9. windows和linux下关闭Tomcat进程

    windows和linux下解决Tomcat进程 windows下启动Tomcat报错,8080端口号被占用,报错信息如下 两种解决方法,一种是关闭了这个端口号,另外一种是修改Tomcat下的serv ...

  10. tomcat 组件研究二--请求过程

    上一篇博客大概总结了tomcat 的组件以及其组织方式,对于tomcat 的启动过程也进行进行了简单的总结,下面这篇博客,继续研究tomcat 处理请求的相关组件,其实就是主要研究Connectors ...