汇编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语言逗号运算符和逗号表达式的使用小结

《C语言逗号运算符和逗号表达式的使用小结》本文详细介绍了C语言中的逗号运算符和逗号表达式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习... 在C语言中逗号“,”也是一种运算符,称为逗号运算符。 其功能是把两个表达式连接其一般形式为:表达

Go语言实现桥接模式

《Go语言实现桥接模式》桥接模式是一种结构型设计模式,它将抽象部分与实现部分分离,使它们可以独立地变化,本文就来介绍一下了Go语言实现桥接模式,感兴趣的可以了解一下... 目录简介核心概念为什么使用桥接模式?应用场景案例分析步骤一:定义实现接口步骤二:创建具体实现类步骤三:定义抽象类步骤四:创建扩展抽象类步

GO语言实现串口简单通讯

《GO语言实现串口简单通讯》本文分享了使用Go语言进行串口通讯的实践过程,详细介绍了串口配置、数据发送与接收的代码实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要... 目录背景串口通讯代码代码块分解解析完整代码运行结果背景最近再学习 go 语言,在某宝用5块钱买了个

GO语言zap日志库理解和使用方法示例

《GO语言zap日志库理解和使用方法示例》Zap是一个高性能、结构化日志库,专为Go语言设计,它由Uber开源,并且在Go社区中非常受欢迎,:本文主要介绍GO语言zap日志库理解和使用方法的相关资... 目录1. zap日志库介绍2.安装zap库3.配置日志记录器3.1 Logger3.2 Sugared

Go语言中如何进行数据库查询操作

《Go语言中如何进行数据库查询操作》在Go语言中,与数据库交互通常通过使用数据库驱动来实现,Go语言支持多种数据库,如MySQL、PostgreSQL、SQLite等,每种数据库都有其对应的官方或第三... 查询函数QueryRow和Query详细对比特性QueryRowQuery返回值数量1个:*sql

GO语言中gox交叉编译的实现

《GO语言中gox交叉编译的实现》本文主要介绍了GO语言中gox交叉编译的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录一、安装二、使用三、遇到的问题1、开启CGO2、修改环境变量最近在工作中使用GO语言进行编码开发,因

从基础到高级详解Go语言中错误处理的实践指南

《从基础到高级详解Go语言中错误处理的实践指南》Go语言采用了一种独特而明确的错误处理哲学,与其他主流编程语言形成鲜明对比,本文将为大家详细介绍Go语言中错误处理详细方法,希望对大家有所帮助... 目录1 Go 错误处理哲学与核心机制1.1 错误接口设计1.2 错误与异常的区别2 错误创建与检查2.1 基础

Go语言中json操作的实现

《Go语言中json操作的实现》本文主要介绍了Go语言中的json操作的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录 一、jsOChina编程N 与 Go 类型对应关系️ 二、基本操作:编码与解码 三、结构体标签(Struc

python语言中的常用容器(集合)示例详解

《python语言中的常用容器(集合)示例详解》Python集合是一种无序且不重复的数据容器,它可以存储任意类型的对象,包括数字、字符串、元组等,下面:本文主要介绍python语言中常用容器(集合... 目录1.核心内置容器1. 列表2. 元组3. 集合4. 冻结集合5. 字典2.collections模块

基于Go语言开发一个 IP 归属地查询接口工具

《基于Go语言开发一个IP归属地查询接口工具》在日常开发中,IP地址归属地查询是一个常见需求,本文将带大家使用Go语言快速开发一个IP归属地查询接口服务,有需要的小伙伴可以了解下... 目录功能目标技术栈项目结构核心代码(main.go)使用方法扩展功能总结在日常开发中,IP 地址归属地查询是一个常见需求: