汇编指令

标志寄存器

自作多情 提交于 2019-12-04 23:24:06
目录 标志寄存器(8086CPU) 作用 大小 使用方式 ZF标志,在第6位,结果为0则为1,否则为0 PF标志,在第2位,结果中1的个数为偶数则为1,否则为0 SF 标志,在第7位,结果为负则为1,否则为0;有符号运算有效 CF标志,在第0位,存储进位或借位的值 OF标志,在第11位,结果溢出则为1,否则为0;没理解透彻 DF标志 串传送指令movsb 串传送指令movsw cld和std设置DF标志位 adc 指令,带位加法指令,用于计算特别大的数据 sbb 指令, 带借位减法指令,用于运算特别大的数据 cmp指令,这个玩意有点复杂(P234, 11.8) pushf和popf 标志寄存器在debug中的表示 标志寄存器(8086CPU) 作用 用来存储相关指令的某些执行结果 用来为CPU执行相关指令提供行为依据 用来控制CPU的相关工作方式 大小 标志寄存器有16位 使用方式 标志寄存器是按位起作用,也就是说每一个位都有专门的含义,记录特定的i西南西 flag的1、3、5、12、13、14、15位在8086CPU中没有使用,不具有任何含义。而0、2、4、6、7、8、9、10、11位都具有特殊的含义 ZF标志,在第6位,结果为0则为1,否则为0 zf (Zero Flag) 是零标志位,在第6位;它记录相关指令执行后,其结果是否为0,如果为0,那么 zf = 1 ;否则 zf

汇编指令分类

匆匆过客 提交于 2019-12-04 23:23:30
汇编 汇编语言包含两种指令: 汇编指令 伪指令 伪指令 没有对应的机器指令,最终不会被CPU执行。伪指令是编译器执行的指令。 segement和ends segement 表示一个段的开始,ends表示一个段的结束 段名 segment 段名 ends 比如: codesg segement codesg ends; end 表示一个汇编程序的结束标记,编译器在编译的时候如果碰到了end,就会结束对源程序的编译 assume 假设某一段寄存器和程序中的某一个用 segment...ends 定义的段相关联。 标号 一个标号指代了一个地址, 步过循环p 遇到loop使用p来进行跳过 跳到指定的语句g ip 使用g ip跳到指定语句 start 告诉程序的入口 assume cs:code code segment dw 0123h, 0456h, 0789h, 0abch, 0defh, 0fedh, 0cbah, 0987h start: mov bx, 0 ; 跳过前面的数据,不加start代码会从数据处开始 mov ax, 0 mov cx, 8 s:add ax, cs:[bx] add bx, 2 loop s mov ax, 4c00h int 21h code ends end start 汇编指令 汇编只有是有对应的机器码的指令,可以被便以为机器指令

Linux内核入门(七)—— 必要的编译知识

丶灬走出姿态 提交于 2019-12-04 17:50:02
http://blog.csdn.net/yunsongice/article/details/5538416 所有的内核代码,基本都包含了include/linux/compile.h这个文件,所以它是基础,涵盖了分析内核所需要的一些列编译知识,本博就分析分析这个文件里的代码: #ifndef __LINUX_COMPILER_H #define __LINUX_COMPILER_H #ifndef __ASSEMBLY__ 首先印入眼帘的是对__ASSEMBLY__这个宏的判断,这个变量实际是在编译汇编代码的时候,由编译器使用-D这样的参数加进去的,gcc会把这个宏定义为1。用在这里,是因为汇编代码里,不会用到类似于__user这样的属性(关于 __user这样的属性是怎么回子事,本博后面会提到),因为这样的属性是在定义函数参数的时候加的,这样避免不必要的宏在编译汇编代码时候的引用。 #ifdef __CHECKER__ 接下来是一个对__CHECKER__这个宏的判断,这里需要讲的东西比较多,是本博的重点。 当编译内核代码的时候,使用make C=1或C=2的时候,会调用一个叫Sparse的工具,这个工具对内核代码进行检查,怎么检查呢,就是靠对那些声明过Sparse这个工具所能识别的特性的内核函数或是变量进行检查。在调用Sparse这个工具的同时,在Sparse代码里,会加上

深入CAS的底层实现机制,以及对应的使用风险

独自空忆成欢 提交于 2019-12-04 14:18:50
概述 CAS(Compare-and-Swap),即比较并替换,是一种实现并发算法时常用到的技术,Java并发包中的很多类都使用了CAS技术。CAS也是现在面试经常问的问题,本文将深入的介绍CAS的原理。 案例 介绍CAS之前,我们先来看一个例子。 /** * @author joonwhee * @date 2019/7/6 */ public class VolatileTest { public static volatile int race = 0; private static final int THREADS_COUNT = 20; public static void increase() { race++; } public static void main(String[] args) throws InterruptedException { Thread[] threads = new Thread[THREADS_COUNT]; for (int i = 0; i < THREADS_COUNT; i++) { threads[i] = new Thread(new Runnable() { @Override public void run() { for (int i = 0; i < 10000; i++) { increase(); } } })

手写bootloader(手写*_*)

╄→尐↘猪︶ㄣ 提交于 2019-12-04 14:01:11
思路 1.关看门狗 2.设置时钟 3.初始化sdram 4.重定位 5.执行main .text 表示代码段 .global _start (global 表示全局标号) 关看门狗 可以调c完成disable_watch_dag 确定看门狗地址0x.... ldr r0 ,=0x... ldr 违汇编指令 mov r1,#0 str r1, [r0] 设置时钟 可以用 c clock_init() CLKDIVN 定义位置board中 ldr r0, =0x4c00001 mov r1, #0x03 0x03 分频系数 //FCLK:HCLK:PCLK=1:2:4, HDIVN=1,PDIVN=1 str r1,[r0] asm 如果是c,它是标志嵌入汇编 读芯片手册,调整异步模式,根据芯片具体情况 mrc 指令将ARM处理器的寄存器中的数据传送到协处理器的寄存器中。如果协处理器不能成功地执行该操作,将产生未定义的指令异常中断 MCR{ } p15, 0, , , {, } 为协处理器将执行的操作的操作码。对于CP15协处理器来说, 永远为0b000,当 不为0b000时,该指令操作结果不可预知 作为元寄存器的ARM寄存器,其值被传< Rd>不能为PC,当其为PC时,指令操作结果不可预知送到得协处理器寄存器中 作为目标寄存器的协处理器寄存器,其编号可能为C0,C1....C15。

汇编基础知识

帅比萌擦擦* 提交于 2019-12-04 11:26:14
1: 数据的表示 微型计算机的字长与微处理器的寄存器位数有关。 以 Intel 80X86 系列微处理器为例,CPU 是 8086/8088、80286 的字长是 16 位(二进制位 bit),那么它们的寄存器的位数一定是 16 位的; 32 位字长的微机 CPU 是 80386/80486 或者 Pentium 系列,它们的寄存器的位数则是 32 位的。 学习汇编语言我们会用到十六进制(H)的数据形式,要使自己尽快习惯用十六进制来思维。在汇编语言中,数值后面分别用字母 B 、 H 、 D 代表二进制(Binary)、十六进制(Hexadecimal)、十进制数(Decimal)(十进制数可以省略 D )。 在计算机中还规定采用字节、字、双字等单位来表示数据。 字节(Byte):8 位二进制数。如 00000101B 或表示成 05H ; 10000101B 或表示成 85H 。 字(Word):16 位二进制数,等于 2 字节。如 1100010111010110B 或表示成 C5D6H 。 双字(Double Word):32 位二进制数,又称为双精度数,等于 4 字节。如 23456789H 。 2: 寄存器的分类 8086 寄存器都是 16 位的寄存器,根据用途可分为 4 种类型。分别是数据寄存器、地址寄存器、段寄存器和控制寄存器 (1)数据寄存器

DEBUG的基本命令的使用[MASM]

好久不见. 提交于 2019-12-04 11:25:50
DEBUG 的基本命令的使用 DEBUG 是专门为汇编语言设计的一种调试工具,它通过步进,设置断点等方式为汇编语言程序员提供了非常有效的调试手段。 DEBUG 的命令都是一个字母,后跟一个或多个参数: 字母 [ 参数 ] 命令的使用中注意: ① 字母不分大小写; ② 只使用 16 进制数,没有后缀字母; ③ 分隔符(空格或逗号)只在两个数值之间是必须的,命令和参数间可无分隔符; ④ 每个命令只有按了回车键后才有效,可以用 Ctrl+Break 中止命令的执行; ⑤ 命令如果不符合 Debug 的规则,则将以 “error” 提示,并用 “^” 指示错误位置。 许多命令的参数是主存逻辑地址,形式是 “ 段基地址 : 偏移地址 ” 。其中,段基地址可以是段寄存器或数值;偏移地址是数值。如果不输入段地址,则采用默认值,可以是缺省段寄存器值。如果没有提供偏移地址,则通常就是当前偏移地址。 对主存操作的命令还支持地址范围这种参数,它的形式是: “ 开始地址 结束地址 ” (结束地址不能具有段地址),或者是: “ 开始地址 L 字节长度 ” 。 DEBUG命令一览: 分类 命令格式 功能简介 读写寄存器 R 显示所有寄存器的当前内容 R 寄存器名 显示和修改指定寄存器内容 RF 显示和修改标志寄存器内容 汇编和反汇编 A[ 内存地址 ] 从指定地址开始汇编指令 U[ 内存块 ]

51单片机 知识总结

喜你入骨 提交于 2019-12-04 09:32:57
  目前单片机种类繁多,而51 单片机作为最基础的一款8位单片机,其资源最少,同时也是最容易学习的一款单片机。学习51单片机的工作原理及其存储结构是十分有必要的。   单片机执行程序的过程,其实就是在执行我们编写的程序的过程( 逐条执行指令 ),该执行过程可以看成是: 取指令--------分析指令-------执行指令。    取指令:根据 PC(程序计数器)的值从程序存储器中取出指令(编写的程序即为指令),送到指令寄存器。( 送到哪里去??? )   分析指令:将指令寄存器中的指令操作码取出后进行译码,分析其指令性质,分析完成便找出操作数的地址。   执行指令:即对分析完成后得到操作数的地址,对该地址的数据进行更新。   计算机执行程序的过程实际上是逐条指令重复以上三个过程,直到遇到停机或循环等待指令。 举例:   开机后,PC 计数器 初始值为 0000H,接着单片机在时序电路下自动进入执行程序过程,循环对程序区进行取指令,执行指令操作。   对于汇编语句: MOV A , #0E0H 该语句的功能表示将操作数 E0H 送到 累加器 A 上。(74H 表示 的指令是将一个数送到 A 累加器去)此时 程序计数器 0000H 位置上存放了 74H , 0001H 上存放了 E0H 。 执行该语句的次序为: 1、取指阶段:PC 上 地址 0000H 上的内容送到地址寄存器去

Linux中自旋锁

▼魔方 西西 提交于 2019-12-04 07:05:51
传统的spinlock   Linux的的内核最常见的锁是自旋锁。自旋锁最多只能被一个可执行线程持有。如果一个执行线程试图获得一个被已经持有(争用)的自旋锁,那么该线程就会一直进行忙循环-旋转-等待锁重新可用要是锁未被争用,请求锁的执行线程就可以立即得到它,继续执行。在任意时间,自旋锁都可以防止多于一个的执行线程同时进入临界区。同一个锁可以用在多个位置,例如,对于给定数据的所有访问都可以得到保护和同步。   自旋锁在同一时刻至多被一个执行线程持有,所以一个时刻只有一个线程位于临界区内,这就为多处理器机器提供了防止并发访问所需的保护机制。在单处理机器上,编译的时候不会加入自旋锁,仅会被当作一个设置内核抢占机制是否被启用的开关。如果禁止内核抢占,那么在编译时自旋锁就会被剔除出内核。   传统的自旋锁本质上用一个整数来表示,值为1代表锁未被占用, 为0或者为负数表示被占用。   在 单处理机环境 中可以使用特定的原子级汇编指令 swap 和 test_and_set 实现进程互斥,(Swap指令:交换两个内存单元的内容;test_and_set指令取出内存某一单元(位)的值,然后再给该单元(位)赋一个新值) 这些指令涉及对同一存储单元的两次或两次以上操作,这些操作将在几个指令周期内完成,但由于中断只能发生在两条机器指令之间,而同一指令内的多个指令周期不可中断

汇编之各个寄存器的作用

陌路散爱 提交于 2019-12-04 06:01:50
原文链接:[ https://www.cnblogs.com/zimmerk/articles/2520011.html ] 4个数据寄存器(EAX、EBX、ECX和EDX) 2个变址和指针寄存器(ESI和EDI) 2个指针寄存器(ESP和EBP) 6个段寄存器(ES、CS、SS、DS、FS和GS) 1个指令指针寄存器(EIP) 1个标志寄存器(EFlags) 1、数据寄存器 数据寄存器主要用来保存操作数和运算结果等信息,从而节省读取操作数所需占用总线和访问存储器的时间。32位CPU有4个32位的通用寄存器EAX、EBX、ECX和EDX。对低16位数据的存取,不会影响高16位的数据。这些低16位寄存器分别命名为:AX、BX、CX和DX,它和先前的CPU中的寄存器相一致。 4个16位寄存器又可分割成8个独立的8位寄存器(AX:AH-AL、BX:BH-BL、CX:CH-CL、DX:DH-DL),每个寄存器都有自己的名称,可独立存取。程序员可利用数据寄存器的这种”可分可合”的特性,灵活地处理字/字节的信息。 寄存器AX和AL通常称为累加器(Accumulator),用累加器进行的操作可能需要更少时间。累加器可用于乘、 除、输入/输出等操作,它们的使用频率很高; 寄存器BX称为基地址寄存器(Base Register)。它可作为存储器指针来使用; 寄存器CX称为计数寄存器(Count