汇编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语言数据类型强制转换自动转换强制转换类型总结C语言数据类型强制转换强制类型转换:是通过类型转换运算来实现的,主要的数据类型转换分为自动转换

利用Go语言开发文件操作工具轻松处理所有文件

《利用Go语言开发文件操作工具轻松处理所有文件》在后端开发中,文件操作是一个非常常见但又容易出错的场景,本文小编要向大家介绍一个强大的Go语言文件操作工具库,它能帮你轻松处理各种文件操作场景... 目录为什么需要这个工具?核心功能详解1. 文件/目录存javascript在性检查2. 批量创建目录3. 文件

C语言实现两个变量值交换的三种方式

《C语言实现两个变量值交换的三种方式》两个变量值的交换是编程中最常见的问题之一,以下将介绍三种变量的交换方式,其中第一种方式是最常用也是最实用的,后两种方式一般只在特殊限制下使用,需要的朋友可以参考下... 目录1.使用临时变量(推荐)2.相加和相减的方式(值较大时可能丢失数据)3.按位异或运算1.使用临时

使用C语言实现交换整数的奇数位和偶数位

《使用C语言实现交换整数的奇数位和偶数位》在C语言中,要交换一个整数的二进制位中的奇数位和偶数位,重点需要理解位操作,当我们谈论二进制位的奇数位和偶数位时,我们是指从右到左数的位置,本文给大家介绍了使... 目录一、问题描述二、解决思路三、函数实现四、宏实现五、总结一、问题描述使用C语言代码实现:将一个整

C语言字符函数和字符串函数示例详解

《C语言字符函数和字符串函数示例详解》本文详细介绍了C语言中字符分类函数、字符转换函数及字符串操作函数的使用方法,并通过示例代码展示了如何实现这些功能,通过这些内容,读者可以深入理解并掌握C语言中的字... 目录一、字符分类函数二、字符转换函数三、strlen的使用和模拟实现3.1strlen函数3.2st

Go语言中最便捷的http请求包resty的使用详解

《Go语言中最便捷的http请求包resty的使用详解》go语言虽然自身就有net/http包,但是说实话用起来没那么好用,resty包是go语言中一个非常受欢迎的http请求处理包,下面我们一起来学... 目录安装一、一个简单的get二、带查询参数三、设置请求头、body四、设置表单数据五、处理响应六、超

C语言中的浮点数存储详解

《C语言中的浮点数存储详解》:本文主要介绍C语言中的浮点数存储详解,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、首先明确一个概念2、接下来,讲解C语言中浮点型数存储的规则2.1、可以将上述公式分为两部分来看2.2、问:十进制小数0.5该如何存储?2.3 浮点

基于Python实现多语言朗读与单词选择测验

《基于Python实现多语言朗读与单词选择测验》在数字化教育日益普及的今天,开发一款能够支持多语言朗读和单词选择测验的程序,对于语言学习者来说无疑是一个巨大的福音,下面我们就来用Python实现一个这... 目录一、项目概述二、环境准备三、实现朗读功能四、实现单词选择测验五、创建图形用户界面六、运行程序七、

使用Go语言开发一个命令行文件管理工具

《使用Go语言开发一个命令行文件管理工具》这篇文章主要为大家详细介绍了如何使用Go语言开发一款命令行文件管理工具,支持批量重命名,删除,创建,移动文件,需要的小伙伴可以了解下... 目录一、工具功能一览二、核心代码解析1. 主程序结构2. 批量重命名3. 批量删除4. 创建文件/目录5. 批量移动三、如何安

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

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