汇编1课 汇编语言:机器指令符号化语言

2023-10-31 00:40

本文主要是介绍汇编1课 汇编语言:机器指令符号化语言,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

优点:可直接访问硬件目标代码简短,执行速度快。

缺点:可移植性差可阅读性差。

ARM指令集特点:1,指令码长度固定,如32bit。2,几乎所有指令都是有条件执行。3,寄存器与内存之间数据采用专用指令集。

一   ARM汇编指令格式

基本指令格式:<opcode> (<cond>) (s)  <Rd> ,<Rn>(,<operand2>)

其中<>是必须的,{}是可选的,各项的说明如下:
opcode:操作码,执行加法或减法或乘法等指令;
cond:执行条件,这个条件去查询CPSR最高位,符合条件才会执行;
CPSR:记录当前CPU运行状态的寄存器;
S:条件执行后是否更新CPSR寄存器的内容;
Rd:目标寄存器,存放执行结果;
Rn:R操作数,n代表有几个,只有符合编码规则的【立即数】才可以放进去;
Rn有三种规则:1,r0,r1,r2;  2,1,2,3;    3,左移两位(<=2),左移三位(<=3);

二  NDK clang在NDK中的路径

 NDK开发文档NDK 使用入门  |  Android NDK  |  Android Developers

 clang在NDK中的路径"d:\android\ndk\toolchains\llvm\prebuilt\windows-x86_64\bin" 将这个路径放入环境变量path中,方便后面随时调用

clang编译选项

clang -target arm-1inux-android21 main.c -o demo     //前两个都是32位的
clang -target armv7a-linux-android21 main.c -o demo  //前两个都是32位的
clang -target aarch64-linux-android21 main.c -o demo    //-o 后面跟上输出文件的名字

预处理
clang -target arm-linux-android21 -E main.c -o main.i

编译
clang -target arm-linux-androideabi21 -S main.i -o main.s

汇编(将代码编译成ef文件)
clang -target arm-linux-androideabi21 -c main.s -o main.o

链接(把所有准备好的文件都串在一起)
clang -target arm-linux-androideabi21 main.o -o demo

clang编译thumb

clang -target arm-linux-android21 -S -mthumb main.c -o demo.s

直接从.c文件编译成thumb文件

clang -target arm-linux-android21 -mthumb main.c -o demo.thumb

二  指令/伪指令/符号

指令:CPU指令的助记符,经过编译得到机器码,由CPU读取执行。

伪指令:本质不是指令(只是和指令一起写在代码中),是编译器环境提供的,目的是用来指导编译过程,经过编译后伪指令最终不会生成机器码。

注释:  @  位置不固定,类似C中//
           #  放在行首,整行注释
            :  以冒号结尾的是标号,在反编译是看不到的
            .  在gnu汇编表示当前指令的地址
           #  #或$都表示立即数,立即数就是数字

常用的gnu伪指令

.ascii  .byte  .short .long .word  .quad  .float  .string  定义数据    

.global_start       给_start外部链接属性(全局变量)
.section              定义节
.text                   指定当前段为代码段
.align 4                              以16字节对齐
.balignl 16 0xabcdefgh     16字节对齐填充
.equ                       类似C中宏定义
.end                       标识文件结束
.include                   头文件包含
.arm / .code32               ARM指令
.thumb / .code16           thumb指令
,file                      文件名
.type                      类型

三  ARM特点

1,ARM数据类型

Byte : 8bit          Halfword : 16bit               Word :  32bit

大部分 ARM core    (同一函数只能使用一种指令集,不可能一个函数混搭使用)
ARM指令集(32-bit)
Thumb 指令集(16-bit)
Thumb2 指令集(16 & 32bit)

2,ARM采用哈佛结构;

哈佛结构:代码和数据要分开放

冯诺依曼:代码和数据可以一起存放

3,LDR/STR架构

ARM采用RISC(精简指令集)架构,CPU本身不能操作内存数据,而是通过寄存器加载入CPU,操作完成之后再通过寄存器存入内存中。

ldr      内存内容加载到寄存器

str      寄存器数据存入到内存内容

RISC架构,有低功耗的特点,一般用在散热差的设备,如手机,嵌入式设备。A系列用在手机上,M系列用在嵌入式设备这种低端CPU上。

4,指令后缀

同一指令经常带有不同后缀,变成不同指令,这些指令功能差不多,只是会有细微差别;

B(byte)功能不变,长度8位;
H(half word) 功能不变,长度16位;
S(signed) 功能不变,变为有符号; 如 ldr ldrb ldrh ldrsb ldrsh
S(S标志) 功能不变,影响CPSR标识符;  如 mov 和 movs  movs r0,#0

四  寄存器:在CPU上,用来存储数据

ARM共有37个寄存器,都是32位长度。有30个是通用型,1个固定用作PC,一个固定用作CPSR,5个固定用作5种异常模式下的SPSR。

  

了解知识点:ARM处理器工作模式
User:非特权模式,大部分任务执行都在这种模式
FIQ:当一个搞优先级(fast)中产生时将会进入这种模式
IRQ:当一个低优先级(normal)中断产生时将会进入这种模式
Supervisor:当复位或软中断指令执行时将会进入这种模式
About:当存取异常时将会进入这种模式
Undef:当执行未定义指令时会进入这种模式
System:使用和User模式相同寄存器集的特权模式
除User(用户模式)是Normal(普通模式)外,其他6种都是Privilege(特权模式)
Privilege中除Sys模式外,其余5中为异常模式
各种模式的切换,可以是程序员通过代码主动切换(通过写CPRS寄存器),也可以是CPU在某些情况下自动切换,各种模式下权限和可以访问的寄存器不同

 简单汇编代码解释 

mov  r,   207        将207传送到寄存器r               

add   r,   9            把寄存器中的内容和9相加,再存回寄存器r中

mov   z,  56          把56传送到寄存器z

sub    z,  48          把寄存器中的内容和48相减,再存回寄存器z中            

div     r,    z           把寄存器r的内容和寄存器z中的内容相除,再存回寄存器r中

mov [12],   r          []说明是个地址,把寄存器r中的内容传送到内存为12的地址中    

hlt                         停止                                                

三  认识8086处理器通用寄存器

AX  AH AL    SI

BX  BH BL    DI

CX  CH CL   SP

DX  DH DL   BP 

1000 0101 0010 1111     8 5 2 F

0011 1100 0000 1001     3 C 0 9

 习题1:

INTER 8086 有哪几个通用寄存器?   这些寄存器的长度是多少?

AX,BX,CX,DX,SI,DI,BP,SP      8个寄存器

都是16位的,长度是1个,合两个字节。

以上寄存器中,有哪些可以分为两个8位的寄存器来用?

这些8位的寄存器叫什么名字?

  AX,BX,CX,DX     AH,AL/BH,BL/CH,CL/DH,DL

习题2:

如果向寄存器DH写入数字08(十六进制),向寄存器DL写入数字3C(十六进制),则寄存器DX的值是多少(用十六进制表示)?   083C

习题3:寄存器BX的内存是55AA(十六进制),在将它写入内存时,指定的地址是0008,低端字节序。那么写入后,将占用几个内存单元?它们的地址分别是多少?它们的内存是什么(采用十六进制)? 2个单元,0008对应的内容是AA,0009对应的内容是55

  地址在代码段如何存放的?

2,在8086中,CS是存放代码段起始位置;DS是存放数据段起始位置;

这篇关于汇编1课 汇编语言:机器指令符号化语言的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/311618

相关文章

C语言中%zu的用法解读

《C语言中%zu的用法解读》size_t是无符号整数类型,用于表示对象大小或内存操作结果,%zu是C99标准中专为size_t设计的printf占位符,避免因类型不匹配导致错误,使用%u或%d可能引发... 目录size_t 类型与 %zu 占位符%zu 的用途替代占位符的风险兼容性说明其他相关占位符验证示

C语言进阶(预处理命令详解)

《C语言进阶(预处理命令详解)》文章讲解了宏定义规范、头文件包含方式及条件编译应用,强调带参宏需加括号避免计算错误,头文件应声明函数原型以便主函数调用,条件编译通过宏定义控制代码编译,适用于测试与模块... 目录1.宏定义1.1不带参宏1.2带参宏2.头文件的包含2.1头文件中的内容2.2工程结构3.条件编

Go语言并发之通知退出机制的实现

《Go语言并发之通知退出机制的实现》本文主要介绍了Go语言并发之通知退出机制的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录1、通知退出机制1.1 进程/main函数退出1.2 通过channel退出1.3 通过cont

Go语言编译环境设置教程

《Go语言编译环境设置教程》Go语言支持高并发(goroutine)、自动垃圾回收,编译为跨平台二进制文件,云原生兼容且社区活跃,开发便捷,内置测试与vet工具辅助检测错误,依赖模块化管理,提升开发效... 目录Go语言优势下载 Go  配置编译环境配置 GOPROXYIDE 设置(VS Code)一些基本

深入理解Go语言中二维切片的使用

《深入理解Go语言中二维切片的使用》本文深入讲解了Go语言中二维切片的概念与应用,用于表示矩阵、表格等二维数据结构,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧... 目录引言二维切片的基本概念定义创建二维切片二维切片的操作访问元素修改元素遍历二维切片二维切片的动态调整追加行动态

Go语言中make和new的区别及说明

《Go语言中make和new的区别及说明》:本文主要介绍Go语言中make和new的区别及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1 概述2 new 函数2.1 功能2.2 语法2.3 初始化案例3 make 函数3.1 功能3.2 语法3.3 初始化

Go语言中nil判断的注意事项(最新推荐)

《Go语言中nil判断的注意事项(最新推荐)》本文给大家介绍Go语言中nil判断的注意事项,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1.接口变量的特殊行为2.nil的合法类型3.nil值的实用行为4.自定义类型与nil5.反射判断nil6.函数返回的

Go语言数据库编程GORM 的基本使用详解

《Go语言数据库编程GORM的基本使用详解》GORM是Go语言流行的ORM框架,封装database/sql,支持自动迁移、关联、事务等,提供CRUD、条件查询、钩子函数、日志等功能,简化数据库操作... 目录一、安装与初始化1. 安装 GORM 及数据库驱动2. 建立数据库连接二、定义模型结构体三、自动迁

Go语言代码格式化的技巧分享

《Go语言代码格式化的技巧分享》在Go语言的开发过程中,代码格式化是一个看似细微却至关重要的环节,良好的代码格式化不仅能提升代码的可读性,还能促进团队协作,减少因代码风格差异引发的问题,Go在代码格式... 目录一、Go 语言代码格式化的重要性二、Go 语言代码格式化工具:gofmt 与 go fmt(一)

Go语言中泄漏缓冲区的问题解决

《Go语言中泄漏缓冲区的问题解决》缓冲区是一种常见的数据结构,常被用于在不同的并发单元之间传递数据,然而,若缓冲区使用不当,就可能引发泄漏缓冲区问题,本文就来介绍一下问题的解决,感兴趣的可以了解一下... 目录引言泄漏缓冲区的基本概念代码示例:泄漏缓冲区的产生项目场景:Web 服务器中的请求缓冲场景描述代码