深圳大学LC3实验2源码
实验二 机器码编程实验源代码LC3汇编
12345678910111213141516.ORIG x3000 ;将x3000作为程序起始位置LD R2 xFF ;读取x3100处的值存入R2AND R1 R1 #0 ;R1初始化为0AND R0 R0 #0 ;R0初始化为0,'1'计数器ADD R1 R1 15 ;循环计数器LOOP AND R2 R2 R2 ;读取R2符号位BRZP x1ADD R0 R0 #1 ;若符号位为1计数器加1ADD R2 R2 R2 ;R2左移一位ADD R1 R1 #-1 ;循环计数器-1BRZP LOOPST R0 xF6HALT.END
LC3机器码
1234567891011121300110000000000000010010011111111010100100110000001010000001000000001001001101111010101001000001000000110000000010001000000100001000101001000001000010010011 ...
深圳大学LC3实验1
实验目的与要求实验目的:
(1)掌握处理器仿真工具LC-3软件的安装和使用方法。
(2)学会在LC-3仿真环境下编辑程序和转换成可执行目标程序的方法 。
(2)学会在LC-3仿真环境下运行和调试程序的方法 。
实验要求:
(1)安装LC-3仿真器
(2)利用LC3EDIT输入机器代码程序(0/1模式)并创建创建可执行目标程序。
(3)利用LC3EDIT输入机器代码程序(hex模式)并创建创建可执行目标程序。
(4)利用LC3EDIT输入汇编代码程序并创建创建可执行目标程序。
(5)利用仿真器运用对应目标程序。
(6)学习和掌握断点,单步执行等调试方法和手段。
实验内容 LC3WinGuide:
通过chapter1-3学习和掌握仿真器的使用。
完成chapter4: P15 example1
P20 example2
实验过程与步骤0x01 安装LC-3仿真器运行”仿真器” 目录下的LC301.exe文件,点击unzip即可
0x02 输入机器or汇编代码编译程序输入一段01二进制程序,然后选 ...
adb工具配置和使用
0x01 下载安装与环境变量配置介绍adb全称全称为Android Debug Bridge(安卓调试桥),它可以与设备进行通信,实现操作管理Android设备
作用1、通过电脑的命令行使用adb,对安卓设备进行操作
2、比如可以在设备上安装或卸载应用
3、可以获取设备的基本信息等
来源1、adb 是Android SDK Platform-Tools中的一个工具,而Android SDK Platform-Tools是Android SDK的一个组件
2、对于安卓开发人员来说,在安装IDE (Android Studio)时或是android SDK时就已经带有这个工具
3、而对于非开发人员,也可以通过直接下载adb安装包的方式安装
下载地址SDK Platform-Tools下载地址
配置环境变量下载解压后将adb所在的地址添加到系统里的环境变量,然后再cmd命令行输入adb,若有adb的信息出现说明配置成功。
0x02 通过adb连接安卓设备adb的工作原理adb 提供对 Unix shell(可用来在设备上运行各种命令)的访问权限。它是一种客户端-服务器程序,包括以下三个组件: ...
emplace_back()
emplace_back( )在容器末尾添加一个新元素,它通常使用 placement-new 在容器提供的位置就地构造元素。
通常要保证操作后的size不大于旧的capacity(end迭代器要重新生成),否则需要重新分配内存,这种情况下所有迭代器和对元素的所有引用都会失效。
下面代码是从cpp reference抄来的,理解一下怎么运行的。
12345678910111213141516171819202122232425262728293031323334353637383940414243444546#include <vector>#include <cassert>#include <iostream>#include <string> struct President{ std::string name; std::string country; int year; President(std::string p_name, std::string p_country, int p_yea ...
栈和寄存器
0x01 寄存器和栈
被调用者保护%rbp ,%rbx和%r12~15
被调用者保护的寄存器在进入一个函数后会先压入栈来保存原先的值
返回值%rax
寄存器rax通常存储着一个函数的返回值
调用者保护除被调用者保护外。
和被调用者保护相反,可以随意修改该寄存器里的值而不需要压入栈来保存
参数%rdi,%rsi,%rdx,%rcx,%r8,%r9
这里默认有六个参数寄存器,在传入函数时使用,超过的参数将在栈帧上保存
栈指针%rsp
指示着栈顶的位置,栈往低处生长
0x02 运行时栈
返回地址在进入一个函数前,先将该call该函数的指令的下一条指令的地址压入栈,当执行ret指令时将该返回地址从栈中弹出,作为%rip的值(下一条执行指令的地址)
被保存的寄存器对应寄存器中的被调用者保护寄存器,进入函数前先保存。
局部变量有时,局部数据必须存放在内存中,常见的情况包括:
1、寄存器不足够存放所有的本地数据。
2、对一个局部变量使用地址运算符'&',因此必须能够为它产生一个地址
3、某些局部变量是数组或结构,因此必须能够通过数组或结构引用被访问到
参数构造区当传入的函数的参数超过六个(对应六个 ...
结构体数据类型所占字节长度
记录一下结构体的数据类型大小怎么算,主要看对齐数和地址偏移量
计算原理举个例子
12345678910111213#include<iostream>typedef struct student { int num; char name[10];//8 byte int com, math, english; double average;//8 byte} stu;stu boy[1000], * p;int main() { std::cout << sizeof(stu)<<"\n"; std::cout << sizeof(int); return 0;}
对齐数的大小,在vs编译器里,是数据类型大小和默认对齐数(vs是8)的最小值。
从第二个数据开始,数据首个字节的地址的偏移量要为对齐数的整数倍
对于数据类型stu,num先填充4 bytes,之后第二个char name[10]的对齐数是10和8的较小值,为8 bytes,首地址应为8的整数倍的偏移地址量,最小为8,所 ...