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

相关文章

python使用fastapi实现多语言国际化的操作指南

《python使用fastapi实现多语言国际化的操作指南》本文介绍了使用Python和FastAPI实现多语言国际化的操作指南,包括多语言架构技术栈、翻译管理、前端本地化、语言切换机制以及常见陷阱和... 目录多语言国际化实现指南项目多语言架构技术栈目录结构翻译工作流1. 翻译数据存储2. 翻译生成脚本

Go语言中三种容器类型的数据结构详解

《Go语言中三种容器类型的数据结构详解》在Go语言中,有三种主要的容器类型用于存储和操作集合数据:本文主要介绍三者的使用与区别,感兴趣的小伙伴可以跟随小编一起学习一下... 目录基本概念1. 数组(Array)2. 切片(Slice)3. 映射(Map)对比总结注意事项基本概念在 Go 语言中,有三种主要

C语言中自动与强制转换全解析

《C语言中自动与强制转换全解析》在编写C程序时,类型转换是确保数据正确性和一致性的关键环节,无论是隐式转换还是显式转换,都各有特点和应用场景,本文将详细探讨C语言中的类型转换机制,帮助您更好地理解并在... 目录类型转换的重要性自动类型转换(隐式转换)强制类型转换(显式转换)常见错误与注意事项总结与建议类型

Go语言利用泛型封装常见的Map操作

《Go语言利用泛型封装常见的Map操作》Go语言在1.18版本中引入了泛型,这是Go语言发展的一个重要里程碑,它极大地增强了语言的表达能力和灵活性,本文将通过泛型实现封装常见的Map操作,感... 目录什么是泛型泛型解决了什么问题Go泛型基于泛型的常见Map操作代码合集总结什么是泛型泛型是一种编程范式,允

Android kotlin语言实现删除文件的解决方案

《Androidkotlin语言实现删除文件的解决方案》:本文主要介绍Androidkotlin语言实现删除文件的解决方案,在项目开发过程中,尤其是需要跨平台协作的项目,那么删除用户指定的文件的... 目录一、前言二、适用环境三、模板内容1.权限申请2.Activity中的模板一、前言在项目开发过程中,尤

C语言小项目实战之通讯录功能

《C语言小项目实战之通讯录功能》:本文主要介绍如何设计和实现一个简单的通讯录管理系统,包括联系人信息的存储、增加、删除、查找、修改和排序等功能,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录功能介绍:添加联系人模块显示联系人模块删除联系人模块查找联系人模块修改联系人模块排序联系人模块源代码如下

基于Go语言实现一个压测工具

《基于Go语言实现一个压测工具》这篇文章主要为大家详细介绍了基于Go语言实现一个简单的压测工具,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录整体架构通用数据处理模块Http请求响应数据处理Curl参数解析处理客户端模块Http客户端处理Grpc客户端处理Websocket客户端

使用SQL语言查询多个Excel表格的操作方法

《使用SQL语言查询多个Excel表格的操作方法》本文介绍了如何使用SQL语言查询多个Excel表格,通过将所有Excel表格放入一个.xlsx文件中,并使用pandas和pandasql库进行读取和... 目录如何用SQL语言查询多个Excel表格如何使用sql查询excel内容1. 简介2. 实现思路3

Go语言实现将中文转化为拼音功能

《Go语言实现将中文转化为拼音功能》这篇文章主要为大家详细介绍了Go语言中如何实现将中文转化为拼音功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 有这么一个需求:新用户入职 创建一系列账号比较麻烦,打算通过接口传入姓名进行初始化。想把姓名转化成拼音。因为有些账号即需要中文也需要英

Go语言使用Buffer实现高性能处理字节和字符

《Go语言使用Buffer实现高性能处理字节和字符》在Go中,bytes.Buffer是一个非常高效的类型,用于处理字节数据的读写操作,本文将详细介绍一下如何使用Buffer实现高性能处理字节和... 目录1. bytes.Buffer 的基本用法1.1. 创建和初始化 Buffer1.2. 使用 Writ