本文主要是介绍汇编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 democlang编译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课 汇编语言:机器指令符号化语言的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!