指令寄存器

浅析VS2010反汇编

China☆狼群 提交于 2020-02-29 07:04:36
第一篇 1. 怎样进行反汇编 在调试的环境下,我们能够很方便地通过反汇编窗体查看程序生成的反汇编信息。 例如以下图所看到的。 记得中断程序的运行,不然看不到反汇编的指令 看一个简单的程序及其生成的汇编指令 #include<stdio.h> #include<windows.h> const long Lenth=5060000/5; int main(){ while(true){ for(long i=0;i<Lenth;i++){ ; } Sleep(10); } } 汇编窗体 2. 预备知识 : 函数调用大家都不陌生,调用者向被调用者传递一些參数,然后运行被调用者的代码,最后被调用者向调用者返回结果,还有大家比較熟悉的一句话。就是函数调用是在栈上发生的,那么在计算机内部究竟是怎样实现的呢? 对于程序,编译器会对其分配一段内存。在逻辑上能够分为代码段。数据段,堆,栈 代码段:保存程序文本。指令指针EIP就是指向代码段。可读可运行不可写 数据段:保存初始化的全局变量和静态变量,可读可写不可运行 BSS:未初始化的全局变量和静态变量 堆(Heap):动态分配内存,向地址增大的方向增长。可读可写可运行 栈(Stack):存放局部变量。函数參数,当前状态。函数调用信息等, 向地址减小的方向增长 。很很重要,可读可写可运行 如图所看到的 寄存器 EAX :累加(Accumulator

51单片机串口通信

主宰稳场 提交于 2020-02-27 15:34:17
这节我们主要讲单片机上串口的工作原理和如何通过程序来对串口进行设置,以及根据所给出的实例实现与PC 机通信。 一、原理简介 51 单片机内部有一个全双工串行接口。什么叫全双工串口呢?一般来说,只能接受或只能发送的称为单工串行;既可接收又可发送,但不能同时进行的称为半双工;能同时接收和发送的串行口称为全双工串行口。串行通信是指数据一位一位地按顺序传送的通信方式,其突出优点是只需一根传输线,可大大降低硬件成本,适合远距离通信。其缺点是传输速度较低。 与之前一样,首先我们来了解单片机串口相关的寄存器。 SBUF 寄存器:它是两个在物理上独立的接收、发送缓冲器,可同时发送、接收数据,可通过指令对SBUF 的读写来区别是对接收缓冲器的操作还是对发送缓冲器的操作。从而控制外部两条独立的收发信号线RXD(P3.0)、TXD(P3.1),同时发送、接收数据,实现全双工。 串行口控制寄存器SCON(见表1) 。 表1 SCON寄存器 表中各位(从左至右为从高位到低位)含义如下。 SM0 和SM1 :串行口工作方式控制位,其定义如表2 所示。 表2 串行口工作方式控制位 其中,fOSC 为单片机的时钟频率;波特率指串行口每秒钟发送(或接收)的位数。 SM2 :多机通信控制位。 该仅用于方式2 和方式3 的多机通信。其中发送机SM2 = 1(需要程序控制设置)。接收机的串行口工作于方式2 或3,SM2

CSAPP学习笔记 —— 运行hello程序解析

孤街浪徒 提交于 2020-02-27 14:06:57
Date : 2020 - 02 - 09 Author : Soler HO Book : Computer System : a Programer's perspective 初始时,shell程序执行它的指令,等待输入一个命令。当键盘上输入字符串“./hello”后,shell程序将字符逐一读入寄存器,再把它存放到内存中。 利用直接存储器存取(DMA)技术,数据可以不通过处理器而直接从磁盘到达主存。步骤如下: 一旦目标文件hello中的代码和书就被加载到主存中,处理器就开始执行hello程序的main程序中的机器语言指令。 这些指令将“hello,world\n”字符串中的字节从主存复制寄存器文件,再从寄存器文件中复制到显示设备,最终显示屏幕上。 来源: oschina 链接: https://my.oschina.net/u/2404777/blog/3164636

X86汇编4.基本指令详解

故事扮演 提交于 2020-02-26 03:47:57
最近学习了X86汇编,其实无论是古老的8086还是现在i3/5/7/9,Xeon3/5,在最基本原理上,都是相通的,只是CPU位数,寻址空间,寄存器个数,指令集的扩充等方面有所不同,对于学习,8086永不过时。 数据: [bx]:eg. mov ax,[bx],表示bx寄存器中的数据作为一个偏移地址EA,段地址SA默认在D中,将SA:EA内存单元中的数据存入AX x ptr: x表示:word、byte,eg. mov word ptr ds:[0],1 start标号:指定程序运行起始地址 伪指令: 1.segment...ends伪指令 格式: XXX segment ;定义一个一个段开始,名称为XXX XXX ends ;定义一个段结尾,名称为XXX 释义:segment...ends指令对,定义一个段XXX。 2.end 释义:end是一个汇编程序结束的标志。 3.assum 释义:表示假设,它假设某一段寄存器和程序中的某一个sgment...ends定义的段相关联,上面示例assume cs:codesg就是将代码段codesg和CPU中的段寄存器cs联系起来。 4.数据定义伪指令 dw:定义数据类型,定义字型数据,如:dw 0123H, 0456H, 0789H db:定义ASCII码数据,eg. db 'unix' dd:定义双字型数据 dup:数据复制,db 3

linux C 中的volatile使用

孤街醉人 提交于 2020-02-23 16:40:25
一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。下面是volatile变量的几个例子: 1). 并行设备的硬件寄存器(如:状态寄存器) 2). 一个中断服务子程序中会访问到的非自动变量(Non-automatic variables) 3). 多线程应用中被几个任务共享的变量 回答不出这个问题的人是不会被雇佣的。我认为这是区分C程序员和嵌入式系统程序员的最基本的问题。嵌入式系统程序员经常同硬件、中断、RTOS等等打交道,所用这些都要求volatile变量。不懂得volatile内容将会带来灾难。 假设被面试者正确地回答了这是问题(嗯,怀疑这否会是这样),我将稍微深究一下,看一下这家伙是不是直正懂得volatile完全的重要性。 1). 一个参数既可以是const还可以是volatile吗?解释为什么。 2). 一个指针可以是volatile 吗?解释为什么。 3). 下面的函数有什么错误: int square(volatile int *ptr) { return *ptr * *ptr; } 下面是答案: 1). 是的。一个例子是只读的状态寄存器。它是volatile因为它可能被意想不到地改变

Go语言goroutine调度器初始化(12)

浪子不回头ぞ 提交于 2020-02-21 08:21:12
本文是《Go语言调度器源代码情景分析》系列的第12篇,也是第二章的第2小节。 本章将以下面这个简单的Hello World程序为例,通过跟踪其从启动到退出这一完整的运行流程来分析Go语言调度器的初始化、goroutine的创建与退出、工作线程的调度循环以及goroutine的切换等重要内容。 package main import "fmt" func main() { fmt.Println("Hello World!") } 首先我们从程序启动开始分析调度器的初始化。 在分析程序的启动过程之前,我们首先来看看程序在执行第一条指令之前其栈的初始状态。 任何一个由编译型语言(不管是C,C++,go还是汇编语言)所编写的程序在被操作系统加载起来运行时都会顺序经过如下几个阶段: 从磁盘上把可执行程序读入内存; 创建进程和主线程; 为主线程分配栈空间; 把由用户在命令行输入的参数拷贝到主线程的栈; 把主线程放入操作系统的运行队列等待被调度执起来运行。 在主线程第一次被调度起来执行第一条指令之前,主线程的函数栈如下图所示: 了解了程序的初始状态之后,下面我们正式开始。 程序入口 在Linux命令行用 go build 编译hello.go,得到可执行程序hello,然后使用gdb调试,在gdb中我们首先使用 info files 命令找到程序入口(Entry point

第五周学习总结

橙三吉。 提交于 2020-02-19 23:24:29
信息安全系统设计基础第六周学习总结 【学习时间: 6 小时】 一、学习过程 1.一个处理器支持的指令和指令的字节级编码称为它的指令集体系结构。 2.程序员可见的状态: Y86程序中的每条指令都会读取或者修改处理器状态中的某些部分。这称为程序员可见状态。 3.存储器:从概念上来说是一个很大的字节数组,保存着程序和数据。 4.程序状态的最后一个部分是状态码Stat,它表明程序执行的总体状态;它会指示是正常运行还是出现了某种异常。 5.Y86指令不允许从一个存储器地址到另一个存储器地址,也不允许从立即数到存储器。 6.halt指令停止指令的执行。并将状态码设置为HLT。 7.Y86利用绝对地址进行寻址,而且使用小端法编码。 8.指令集的一个重要性质就是字节编码必须有唯一的解释。 9.Stat包括四种状态,除了AOK表示正常执行外,其他状态都会导致处理器停止。在更完整的设计中,处理器通常都会调用一个异常处理程序。 10.Y86与IA32代码主要的区别就是,前者需要多条指令去执行一条IA32指令完成的功能。 11.以“.”开头的是汇编器命令,它们告诉汇编器调整地址,以便在那产生代码或者是插入一些数据。 12.指令模拟器YIS 目的是模拟Y86机器代码程序的执行,而不用试图去模拟任何具体处理器实现的行为。 13.将很多的逻辑门组合成一个网,就能构建计算块,称为组合电路。限制如下:

关于CPU的一点知识

醉酒当歌 提交于 2020-02-19 17:12:35
首先说一下,CPU是干啥的: CPU所负责的就是解释和运行最终转换成机器语言的程序内容 我们需要知道的CPU结构:重点需要关注寄存器 运算器 简单说就是负责运算从内存读取到寄存器中的数据,可以看作一个数据加工厂,就是对寄存器中的数据做运算,这些运算包含基本的算术和逻辑运算。 算术逻辑单元(ALU) 这个是运算器中重要的一个组成,主要负责的就是对数据的处理,从而实现对数据的算术和逻辑运算 累计寄存器(AC) 通常叫做累计器,是一个通用寄存器。当ALU处理完算术运算或者逻辑运算之后,会得到一个结果,这个结果就会保存在AC中。 数据缓冲寄存器(DR) 这个DR也是存放数据的,存放的主要是从内存读取过来的数据,会暂时存放在这个DR中,这里就相当于内存和CPU之间做数据传送的一个中转站。CPU和内存的速度是有很大差别的,中间引入一个DR,一定程度上起到了速度上的缓冲作用。 状态条件寄存器(PSW) 首先寄存器还是保存数据的,所以PSW自然也是保存某一类数据的。它保存的主要是由算术指令和逻辑指令运行或者测试的结果建立的各种条件码内容,一般分为状态标志和控制标志。 控制器 上面介绍的运算器只是起到了运算的功能,控制器是控制整个CPU的工作,对于控制器,一般要能够保证程序的正确执行以及能够处理异常事件。 指令寄存器(IR) 顾名思义,指令寄存器是用来保存指令的。也就是说,CPU要执行一条指令的话

CPU中断的工作原理,从最底层讲起

a 夏天 提交于 2020-02-15 13:23:23
  前言   中断的概念属于硬件层。虽然我们在进行软件编程时不会直接使用中断,但理解它对我们来说依然重要。   我们在使用线程切换及状态管理、异常处理、硬件与处理器的交互、I/O操作等指令时,中断都在默默的为我们服务。   处理器基于硬件封装对外的指令集,底层语言封装指令集为我们提供更加简单的抽象,高级语言基于底层语言赋予程序更明确的语义。可以看到在这条关系链条中,下层的变动会牵一发而动全身影响上层。而上层想要提高效率,改变机制也必须得到下层的支持。   像 I/O 处理的不断演进,从占用CPU等待到通过中断阻塞等待到多路复用与异步,如果没有下层的支持上层是不可能实现的。而不了解下层的原理我们也很难真正理解一个机制的高效的原因。因此了解下层的原理对应用层工程师来说同样重要。   什么是中断   现代计算机具有多任务处理的能力,往往一台我们办公使用的普通计算机上都会同时运行着几十上百的任务(进程)。我们很难想象,我们点击一下鼠标,需要等待计算机的进程调度模块调度到鼠标处理任务后再给我们做出响应,这对我们来说是不可接受的。   现实是我们在点击鼠标或键盘时(正如我现在在做的事情),计算机会立即给我反馈处理结果,计算机与我们之间是在进行实时交互的。而实时性的实现便是依赖了中断,中断是为了顺应人们对实时性交互的需求而产生的技术。中断之所以有用,是因为它会立刻停下当前的程序(软件

MODBUS协议整理——功能码简述

那年仲夏 提交于 2020-02-12 05:46:28
1.Modbus简介——来自维基百科 Modbus是一种串行通信协议,是Modicon于1979年,为使用可编程逻辑控制器(PLC)而发表的。Modbus是工业领域通信协议的业界标准,并且现在是工业电子设备之间相当常用的连接方式。Modbus比其他通信协议使用的更广泛的主要原因有: 【1】公开发表并且无版税要求 【2】相对容易的工业网络部署 【3】对供应商来说,修改移动原生的位元或字节没有很多限制 图1 modbus结构示意图—— 来自 2.协议整理链接 【 功能码简述 】 【 读线圈寄存器01H、读离散输入寄存器02H 】 【 读保持寄存器03H、读输入寄存器04H 】 【 写单个线圈寄存器05H、写单个保持寄存器06H 】 【 写多个线圈寄存器0FH,写多个保持寄存器10H 】 3.相关博文 【 freemodbus modbus TCP 学习笔记 】——freemodbus+uIP 【 树莓派学习笔记——实现modbus RTU从机 】——raspberry+python modbus-tk 【 EasyARM i.mx28学习笔记——通过modbus tcp控制GPIO 】——i.mx287+freemodbus modbus tcp 【 MODBUS学习笔记——modbus tk modbus TCP主机实现 】 1.MODBUS功能码简述