汇编指令初步

汇编指令初步

指令和数据的存储方式

数据在SRAM存储器中的存储方法

AVR iATtiny88处理器从SRAM起始地址0x100开始存储数据,0x100之前的空间预留给系统使用
存储空间 | 功能 | 先后顺序
-|-|-
data区 | 存储已初始化的变量 | 先
bss区 | 存储未初始化的变量 | 后

指令机器码在FLASH存储器中的存储方法

启动
函数
退出

汇编程序分析

PC指针:程序计数器

非转移指令

2个字节为一个指令单元,根据指令占多少字节长度,决定PC加多少

转移指令

将PC值更新为将要跳转的地址

SP堆栈指针

函数调用时保存调用函数指令的下一条指令地址
在AVR处理器中,堆栈空间位于SRAM的尾部
SP指针一直指向栈顶
call指令与ret指令通常配套执行,分别完成函数执行现场保存与回复工作

汇编代码分析

变量的赋值

例:s[1]=20;//&s[1]=0x0104
ldi r24,0x14//ldi : load immediate,装载一个字节立即到寄存器 ldi r25,0x00 sts 0x0105,r25//sts :store SRAM,向SRAM数据空间中写。 sts 0x0104,r24 //load表示装载,也即读操作 //store表示存储,也即写操作

ldi和lds的区别

ldi r24,0x14//读一个立即数,其中的0x14为一个16进制的数值 lds r24,0x0108//从SRAM中读出一个数,其中的0x0108为一个地址

函数的调用

例:d=funA(s[0],d);
lds r24,0x0102 lds r25,0x0103 ldi r22,0x46;70 ldi r23,0x01;1 rcall .-78
1.需要将函数调用的局部变量和全局变量传入寄存器
局部变量使用ldi
全局变量使用lds
2.调用子函数funA
rcall功能:跳转到子函数的地址处执行
rcall是相对跳转(r表示relative)目的地址 = 当前地址 + 偏移值
rcall .-78//要跳转的子函数地址为:0xae(当前地址)+(-78)=0x60(目的地址)

函数的返回

例:

int funA(int x,int y)
{
add r22,r24//低位相加
adc r23,r25//高位相加,(标记位c表示考虑进位),adc为带进位的加法指令
    return x+y;
mov r24,r22//mov:拷贝指令
mov r25,r23
ret
}

注:AVR处理器约定:从寄存器r25开始(寄存器r26~r31为预留寄存器,专用于间接寻址),依据传递的各个参数的所占字节数,依次往下使用寄存器

lds r24,0x0060// 0x0060导出至寄存器r24

`
ldi r22,0x14 //将立即数常量0x14写入寄存器R22中

`

原文地址:https://www.cnblogs.com/sgawscd/p/10849342.html

时间: 2024-11-12 11:05:19

汇编指令初步的相关文章

Assembly instructions 汇编指令解析 A&AT

Assembly instructions 汇编初步学习 汇编0基础的戳上面,刷一遍,包治百病 %eax寄存器的值与C语言的return的值相对应 (%esp)地址处储存的是函数的返回地址 return address %esp 栈顶寄存器 保存栈顶指针. %ebp = boundary between parameters and local variable 函数执行时不要改变这个寄存器的值! pushl 指令究竟都干了什么: pushl x 等价于 subl $4, %esp; movl

【汇编语言】——用机器指令和汇编指令编程

初入大二,刚刚接触和学习汇编语言这门课程,肯定有很多的不足和漏洞:本篇文章是关于王爽编著的<汇编语言>(第三版)第二章的章后实验的实验报告和总结. 一 实验环境的配置和测试 Debug是DOS,Windows都提供的实模式(8086方式)程序的调试工具.使用它,可以查看CPU各种寄存器中的内容,内存的情况和在机器码级跟踪程序的运行.64位win10系统下,可以通过安装DOSBox软件来配置一个虚拟的工作环境. 相关的软件放在我的百度云盘,还没有安装的可以通过以下链接下载. 链接: https:

汇编实验二 用机器指令和汇编指令编程

实验二  用机器指令和汇编指令编程 任务一: (1)用E命令将内存单元0021:0~0021:7连续8个字节数据修改为30H,31H,32H,33H,34H,35H,36H,37H. (2)用A命令输入汇编指令: (3)用T命令单步执行: 在用T命令执行MOV SS,AX时,它的下一条指令MOV  SP,0100同时执行. (4)填写书上内容: 任务二: 观察如图实验过程,分析为什么2000:0~2000:f中的内容会发生改变. 任意时刻,SS:SP指向栈顶元素,初始时栈为空.初始时,栈顶为0B

汇编指令解析

X86架构 [原创]X86汇编之指令格式解析 [原创]汇编指令之OpCode快速入门 [原创]X64汇编之指令格式解析 ARM架构:

Android 图解逆向工程中ARM常用汇编指令(一)

我们走得太快,灵魂都跟不上了. 微小的幸福就在身边,容易满足就是天堂. 在逆向和爆破中我们经常会在IDA中接触到汇编,一般做安卓的不会太了解VB回编等,不太了解的同学可以先查看上篇文章<Android ARM常用的汇编指令合集> 再来继续我们的学习,我们先来看张图. 这个view里面有 PUSH/LDR/SUB/MOVS/BLX/SUBS/BEQ/CMP ,这些差不多都是常见的,不过也不需要看得懂,理解这个指令即可,接下来我们就来分析下这些指令分别有什么作用吧. 先引入 概念性 东西,免得大家

如何实现对ARM汇编指令的调试?

学习ARM汇编语言时,少不了对ARM汇编指令的调试.作为支持多语言的调试器,gdb自然是较好的选择.调试器工作时,一般通过修改代码段的内容构造trap软中断指令,实现程序的暂停和程序执行状态的监控.为了在x86平台上执行ARM指令,可以使用qemu模拟器执行ARM汇编指令,具体的调试方法,一起来看看吧. 一.准备ARM汇编程序 首先,我们构造一段简单的ARM汇编程序作为测试代码main.s. .globl _start _start: mov R0,#0 swi 0x00900001 以上汇编指

汇编指令速查

指令 功能 AAA 调整加 AAD 调整除 AAM 调整乘 AAS 调整减 ADC 进位加 ADD 加 AND 与 ARPL 调整优先级 BOUND 检查数组 BSF 位右扫描 BSR 位左扫描 BSWAP 交换字节 BT 位测试 BTC 位测试求反 BTR 位测试清零 BTS 位测试置一 CALL 过程调用 CBW 转换字节 CDQ 转换双字 CLC 进位清零 CLD 方向清零 CLI 中断清零 CLTS 任务清除 CMC 进位求反 CMOVA 高于传送 CMOVB 低于传送 CMOVE 相等

汇编指令mov、add、sub、jmp

mov:寄存器,数据 mov:寄存器,寄存器 mov:寄存器,内存单元 mov:段寄存器,内存单元 mov:内存单元,寄存器 mov:内存单元,段寄存器 mov:段寄存器,寄存器 mov:寄存器,段寄存器 add:寄存器,数据 add:寄存器,寄存器 add:内存单元,寄存器 add:寄存器,内存单元 sub:寄存器,数据 sub:寄存器,寄存器 sub:内存单元,寄存器 sub:寄存器,内存单元 jmp:段地址:偏移地址  用段地址修改CS 用偏移地址修改IP jmp:寄存器,只用寄存器的内容

查看汇编指令的二进制代码

今天在尝试ptrace设置断点达时候想知道syscall这条汇编指令对应达二进制码是多少. 百度无果之后在stackoverflow上看到这么个问题 http://stackoverflow/questions/9815448/jmp-instruction-hex-code 里边哥们问jmp对应的二进制码是多少,大神是这么回答的 echo 'asm("mov $400835, %rax\n jmp %rax\n");' >a.c gcc -c a.c objdump -d a.