1、Linux汇编——初识汇编
2019独角兽企业重金招聘Python工程师标准>>>
前序
本来想Qt能继续坚持下来,可是绕了一大圈,最终还是选择回到学期伊始的Linux汇编编程上来。鉴于图书馆只能借到这本书,虽然不厚,但是内容还是比较实用丰富,作为入门教程相当不错。以后将不断更新其阅读内容、个人感悟和相关汇编代码。一方面和大家分享,另一方面,也锻炼我写博文的能力和培养记录的良好习惯。为以后工作做铺垫。至于Qt,我想先推推——C++11正在看,所以还是希望有一个比较好的铺垫。基础夯实了,后面的路感觉会好走一些。
正文
第二章 内存详解
这里的内存就先不详细说了,可以参考其他资料。
主要说下环境:该书使用32位X86汇编,所以默认一个字=4Bytes
寻址方式
1、立即数寻址:指令中包含传输的数字,如 :movl $1, %eax,表示将数“1”存储到寄存器eax中。
2、寄存器寻址:指令中给出要访问的寄存器号,如:movl $1, %eax,寻找的为eax寄存器
3、直接寻址: 指令中直接给出内存的段内偏移地址。如 movl $1, 2 表示将数“1”存入内存ds:2中
4、变址寻址:基址用常数表示,偏移量存储在寄存器中。同时可以固定某个整数作为比例因子(步进)。(数组的遍历)
5、间接寻址:寄存器中存储要访问的内存偏移量。
6、基址寻址:寄存器存储基址,一个常数表示偏移量。(访问结构性数据)
第三章 编写第一个程序
程序1;
#目的:退出程序,向Linux内核返回一个状态码
#输入:无
#输出:想Linux内核返回状态码,程序运行结束后,用shell命令:echo $? 查看返回的状态码
#变量:%eax 系统调用号%ebx 返回状态吗
.section .data
.section .text
.globl _start
_start: movl $1, %eax #系统调用号movl $0, %ebx #返回操作码int 0x80 #中断调用
如上为汇编程序exit.s,编译程序: as exit.s -o exit.o
链接程序 : ld exit.o -o exit
运行程序:./exit
查看返回码:echo $?
知识点:
1、.section .data :“.”表示汇编程序的伪指令,指导编译器的行为。该段为数据段。
2、.section .text:该段为代码段,本段存放需要执行的命令。
3、.globl _start:表示标号_start后面的代码段为全局,其表示为程序的入口。
4、前缀“e”表示32位寄存器,前缀“r”表示64位寄存器,如“rax”
5、通用寄存器有以下几个:%eax, %ebx, %ecx ,%edx, %edi, %esi
专用寄存器有以下几个:%ebp,%esp,%eip,%eflags
6、当进行系统调用时,%eax存系统调用号,%ebx存向系统返回的状态码,int表示中断,此指令将调用终端程序。
程序2:
#目的:寻找一维数组中最大值
#变量: %edi——当前数组元素的下表(索引)
# %ebx——当前最大值
# %eax——当前数据项
#数据段:data_items:0表示数组结束
.section .datadata_items: .long 3,67,32,222,45,75,54,33,22,11,66.section .text
.globl _start
_start: movl $0, %edi #索引值从0开始movl data_items(,%edi,4), %eax #使用变址寻址法,给出步进长度为4movl %eax, %ebx #初始时第一项为最大值start_loop: cmpl $0, %eax #判断是否到达数组末尾je loop_exit #到达数组末尾,退出循环,作收尾工作incl %edi #未到达末尾,索引加1movl data_items(,%edi,4), %eaxcmpl %ebx, %eax #与当前最大值进行比较jle start_loop # %eax <= %ebxmovl %eax, %ebx # %eax > %ebx,则进行交换jmp start_loop
loop_exit:movl $1, %eax # 1为系统调用exit()的调用号int $0x80 #中断调用
编译:as maximum.s -o maximum.o
链接:ld maximum.o -o maximum
运行:./maximum
查看返回结果:echo $?
知识点
1、data_items中的“.long”表示数据类型,汇编语言中有以下数据类型可供使用:
(1).byte:占1 byte, 范围0~255
(2).int :占2 byte,范围:0~65535
(3).long :占4 byte, 范围:0~4 294 967 295
(4).ascii:用于将字符输入内存,每个字符占一个byte,如:.ascii "hello world\0",“\0”表示字符串末尾
2、对于数组,可以有如下方式表示:
(1)数组长度作为第一个元素
(2)数组末尾用特殊符号标记
3、注意上面的最大值不能超过255,因为程序的退出状态码最大为255。
4、条件跳转指令:当使用条件跳转指令时,需要使用cmpl指令对两个数进行比较:cmpl a , b。条件跳转指令有:
(1)je :当 a==b时,跳转到目标地址
(2)jg:当 b>a时,则跳转。
(3)jge:当 b >= a时,则跳转
(4)jl : 当 b <a 时,则跳转
(5)jle :当 b<=a时,则跳转
(6)jmp:无条件跳转
5、寻址方式:
(1)索引寻址方式:地址或偏移(%基址寄存器,%索引寄存器,比例因子),
结果地址=地址或偏移+%基址或偏移量寄存器+比例因子 * %索引寄存器
需要注意:地址或偏移量、比例因子必须为常数,其余两个必须为寄存器,若省略任何一项可用0代替。地址和偏移量寄存器可省略,但需加后面的“逗号”。
(2)其他寻址方式参考第二章内容
6、关于指令中数据的字长:
(1)movl表示传输一个“字”的数据,若只想传输一个“字节”,则使用指令movb,
(2)%eax的低字节为%ax,%ax的高一字节为%ah,低一字节为%al。
转载于:https://my.oschina.net/u/438386/blog/541802
1、Linux汇编——初识汇编相关推荐
- stol函数在linux下使用,Linux下ATT汇编语法简介一
这显得很古怪,不过在gcc知道程序员拿这些寄存器做些什么后,这确实能够对gcc的优化操作有所帮助.表5-3中是一些可能会用到的寄存器加载代码及其具体的含义. 表5-3 常用寄存器加载代码说明 代 码 ...
- linux 编译汇编,linux下的汇编教程
linux下的汇编教程 第一部分 Linux下ARM汇编语法尽管在Linux下使用C或C++编写程序很方便,但汇编源程序用于系统最基本的初始化,如初始化堆栈指针.设置页表.操作 ARM的协处理器等.初 ...
- Linux下ARM汇编教程
转载:http://blog.csdn.net/denlee/article/details/2501182 第一部分 Linux下ARM汇编语法 尽管在Linux下使用C或C++编写程序很方便,但汇 ...
- 汇编:汇编的基本介绍
文章目录 1.编程语言的发展 2.汇编语言的特点 3.汇编语言 VS 高级语言 4.汇编语言的用途 5.汇编语言的种类 1.编程语言的发展 机器语言 由0和1组成 汇编语言(Assembly Lang ...
- ARM汇编:汇编中proc、endp、ret、near、far指令用法
ARM汇编:汇编中proc.endp.ret.near.far指令用法 子程序名 PROC NEAR ( 或 FAR ) -- ret 子程序名 ENDP (1)NEAR属性(段内近调用): 调用程序 ...
- Linux下用汇编输出Hello, world
下列是Intel汇编语法实现的 Hello, world!程序. ;; hello.asm ;; nasm -f elf hello.asm; will output hello.o ;; ld -s ...
- linux 64位module内联汇编,@yuanbor: Linux内联汇编总结
1.基本格式 __asm__ __volatile__("Instruction List" : Output : Input : Clobber/Modify); 注意:内联汇编 ...
- x86汇编 linux,Linux操作系统的X86汇编程序设计
本质上来说, 这篇文章是把我最感兴趣的两样编程东西: Linux 操作系统和汇编语言程序设计结合在一起. 这两个都不(或者说应该不)需要介绍; 像 Win32 的汇编,Linux 的汇编运行在 32 ...
- linux之用汇编(ATT)的角度理解C的函数调用
第一步:写一个简单的C程序 C文件:main.c #include <stdio.h> int g(int x, int y) {return x + y; }int f(int x, i ...
最新文章
- ios 检测是否安装微信异常
- CSS 框模型——规定了元素框处理元素内容、内边距、边框和外边距的方式
- HDFS副本放置策略和机架感知
- input输入框的各种事件
- 字符串操作 c语言,C语言字符串操作(示例代码)
- vue 导入element-ui css报错解决方法
- walle的试用和结合vagrant
- centOS安装oracleDB,静默安装DBCA的时候,报错
- AMD平台下在Windows虚拟机中安装Mac10.8.3的注意事项
- selenium和junit 的使用
- Linux各个文件夹介绍
- 使用RouteDebugger对MVC路由进行调试
- 多用户文件系统java实现_小师妹学JavaIO之:文件系统和WatchService
- 自己动手源码包制作rpm 包 (二)
- 工控安全PLC固件逆向二
- STM32学习记录——SIM900A实现中英文短信发送
- 优盘文件或目录损坏且无法读取怎样解决
- 前端vue实现图片压缩并且将其转换为jpg格式图片;前端转换图片格式;前端使用js转换图片格式;前端使用canvas将png格式图片转成jpg格式
- ubuntu切换python版本解决语法不匹配问题(SyntaxError: invalid syntax)
- 强大的nginx反向代理异步传输模式(原理)