汇编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

相关文章

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

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

Go语言如何判断两张图片的相似度

《Go语言如何判断两张图片的相似度》这篇文章主要为大家详细介绍了Go语言如何中实现判断两张图片的相似度的两种方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 在介绍技术细节前,我们先来看看图片对比在哪些场景下可以用得到:图片去重:自动删除重复图片,为存储空间"瘦身"。想象你是一个

Go语言中Recover机制的使用

《Go语言中Recover机制的使用》Go语言的recover机制通过defer函数捕获panic,实现异常恢复与程序稳定性,具有一定的参考价值,感兴趣的可以了解一下... 目录引言Recover 的基本概念基本代码示例简单的 Recover 示例嵌套函数中的 Recover项目场景中的应用Web 服务器中

Go语言中使用JWT进行身份验证的几种方式

《Go语言中使用JWT进行身份验证的几种方式》本文主要介绍了Go语言中使用JWT进行身份验证的几种方式,包括dgrijalva/jwt-go、golang-jwt/jwt、lestrrat-go/jw... 目录简介1. github.com/dgrijalva/jwt-go安装:使用示例:解释:2. gi

Go 语言中的 Struct Tag 的用法详解

《Go语言中的StructTag的用法详解》在Go语言中,结构体字段标签(StructTag)是一种用于给字段添加元信息(metadata)的机制,常用于序列化(如JSON、XML)、ORM映... 目录一、结构体标签的基本语法二、json:"token"的具体含义三、常见的标签格式变体四、使用示例五、使用

Go语言使用slices包轻松实现排序功能

《Go语言使用slices包轻松实现排序功能》在Go语言开发中,对数据进行排序是常见的需求,Go1.18版本引入的slices包提供了简洁高效的排序解决方案,支持内置类型和用户自定义类型的排序操作,本... 目录一、内置类型排序:字符串与整数的应用1. 字符串切片排序2. 整数切片排序二、检查切片排序状态:

基于Go语言实现Base62编码的三种方式以及对比分析

《基于Go语言实现Base62编码的三种方式以及对比分析》Base62编码是一种在字符编码中使用62个字符的编码方式,在计算机科学中,,Go语言是一种静态类型、编译型语言,它由Google开发并开源,... 目录一、标准库现状与解决方案1. 标准库对比表2. 解决方案完整实现代码(含边界处理)二、关键实现细

如何合理管控Java语言的异常

《如何合理管控Java语言的异常》:本文主要介绍如何合理管控Java语言的异常问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、介绍2、Thorwable类3、Error4、Exception类4.1、检查异常4.2、运行时异常5、处理方式5.1. 捕获异常

C语言中的常见进制转换详解(从二进制到十六进制)

《C语言中的常见进制转换详解(从二进制到十六进制)》进制转换是计算机编程中的一个常见任务,特别是在处理低级别的数据操作时,C语言作为一门底层编程语言,在进制转换方面提供了灵活的操作方式,今天,我们将深... 目录1、进制基础2、C语言中的进制转换2.1 从十进制转换为其他进制十进制转二进制十进制转八进制十进

$在R语言中的作用示例小结

《$在R语言中的作用示例小结》在R语言中,$是一个非常重要的操作符,主要用于访问对象的成员或组件,它的用途非常广泛,不仅限于数据框(dataframe),还可以用于列表(list)、环境(enviro... 目录1. 访问数据框(data frame)中的列2. 访问列表(list)中的元素3. 访问jav