汇编指令

第二章知识梳理

此生再无相见时 提交于 2020-01-02 06:18:05
1.CPU 由运算器、控制器、寄存器等器件构成,这些器件靠内部总线(区别于前面所说的外部总线)相连。 内部总线:实现CPU内部各个器件的相连。 外部总线:实现CPU和主板上各个器件的相连。 2.寄存器: 对于汇编语言,是CPU中的主要部件。程序员通过改变各种寄存器的内容实现对CPU的控制。 不同CPU寄存器的个数、结构不相同。 8086CPU14个寄存器。 3.通用寄存器。 8086CPU:所有寄存器都是16位的,AX,BX,CX,DX被称为通用寄存器。 AX,BX,CX,DX这四个存储器可分为两个独立的8位寄存器来使用。AX(BX,CX,DX)分为A(B,C,D)H和A(B,C,D)L; 4.字在寄存器中的存储: 字记为word,一个字两个字节,分为高位字节和低位字节。 5.几条汇编指令。 (1)mov 指令:传送指令,将寄存器中的值送到另个寄存器中或将值传送到寄存器中。 (2)add指令:相加指令,将寄存器的值与另一个寄存器的值或另一个值相加送入到寄存器中。 注意:在进行数据传送运算时,要注意指令的两个操作对象的位数是一致的。 6.物理地址: 每一个内存单元存在的唯一地址。 8086CPU: (1)16位机:运算器一次最多处理16位的数据。 寄存器的最大宽度为16位。 寄存器和运算器之间的通路是16位。 (2)物理地址=段地址*16+偏移地址=基础地址+偏移地址。 7.段:

汇编语言程序设计第二章小结

喜你入骨 提交于 2020-01-02 06:17:19
一、通用寄存器:AX、BX、CX和DX。(均为16位,可存放2个字节)。都可以分为两个独立的8位寄存器。(eg:AH和AL,其中AL为低8位,AH为高8位。) 二、字在寄存器中的存储 1字节(byte)=8bit,1个字=2字节=高位字节+地位字节,分别对应存在高位寄存器和低位寄存器中。 三、汇编指令 注意:在写一条汇编指令或一个寄存器名称时不用区分大小写。 引入:mov和add 溢出问题:AH和AL是两个不相关到的寄存器,当操作AL中有进位时,AL不会向AH进位。 (eg: mov ax,00C5H add al,93H 执行前al中的数据为C5H,相加后得到158H,但是al是8位寄存器,只能放两位16进制的数据,所以最高位的1丢失。ax中的数据为:0058H。这里的丢失指的是进位值不能在8位寄存器中保存,但是并不是CPU真的丢弃这个进位值。 ) 进行数据的传送或运输时,两个操作对象的位数需要相同。 (eg:错误指令:mov al,20000 8位寄存器最大可以存放的值为255的数据) 四、物理地址 所有的内存单元构成的存储空间是一个一维的线性空间,每个内存空间在这个空间中都有的惟一的地址,成为物理地址。 五、16位结构的CPU 结构特性: 1、运算器一次最多可以处理16位的数据。 2、寄存器的最大宽度为16位。 3、寄存器和运算器之间的通路为16位。 六

[书]x86汇编语言:从实模式到保护模式 -- 第11章 进入保护模式,初识全局描述符表GDT

為{幸葍}努か 提交于 2020-01-01 22:26:23
进入保护模式;初始化全局描述符表,通过GDT进入代码段、数据段、堆栈段 ; FILE: c11_mbr.asm ; DATE: 20191229 ; TITLE: 硬盘主引导扇区代码 ; 设置堆栈段和栈指针 ; 0x07c00以此为界限,mbr代码段cs:ip向上,mbr堆栈段ss:sp向下 mov ax, cs mov ss, ax mov sp, 0x7c00 ; 计算gdt所在的逻辑段地址 ; 32位忽略高位0,折算为20位,即ds:bx形式(ds*16 + bx) mov ax, [cs:gdt_base + 0x7c00] ; 低16位 mov dx, [cs:gdt_base + 0x7c00 + 2] ; 高16位 mov bx, 16 div bx mov ds, ax ; 商为逻辑段地址 mov bx, dx ; 余数为偏移地址 ; 创建gdt第#0号描述符 ; 处理器规定,gdt中第一个描述符必须是空描述符 mov dword [bx], 0x00000000 mov dword [bx+0x04], 0 ; 创建gdt第#1号描述符,保护模式下的代码段描述符 ; 该段:线性基地址为0x0000 7c00,段界限为0x0 01FF(即段长512字节),粒度为字节(G=0) ; 属于存储器的段(S=1),是32位的段(D=1),目前位于内存中(P=1)

DEBUG命令详解

ε祈祈猫儿з 提交于 2020-01-01 12:39:28
DEBUG是DOS中的一个外部命令,从DOS 1.0起就带有此命令,因此可见此命令的重要性了。虽然此命令的功能非常强大,可以解决许多问题,可是对许多人来说,尤其是初学者来说,却非常不易掌握。因此,现将DEBUG的命令详细介绍一番,以让大家知道它的使用。 Debug:A(汇编) 直接将 8086/8087/8088 记忆码合并到内存。 该命令从汇编语言语句创建可执行的机器码。所有数值都是十六进制格式,必须按一到四个字符输入这些数值。在引用的操作代码(操作码)前指定前缀记忆码。 a [address] 参数 address 指定键入汇编语言指令的位置。对 address 使用十六进制值,并键入不以“h”字符结尾的每个值。如果不指定地址,a 将在它上次停止处开始汇编。 有关将数据输入到指定字节中的信息,请单击“相关主题”列表中的 Debug E(键入)。 有关反汇编字节的信息,请单击“相关主题”列表中的 Debug U(反汇编)。 说明 使用记忆码 段的替代记忆码为 cs:、ds:、es: 和 ss:。远程返回的记忆码是 retf。字符串处理的记忆码必须明确声明字符串大小。例如,使用 movsw 可以移动 16 位的字串,使用 movsb 可以移动 8 位字节串。 汇编跳转和调用 汇编程序根据字节替换自动将短、近和远的跳转及调用汇编到目标地址。通过使用 near 或 far

汇编总结:lea指令

两盒软妹~` 提交于 2019-12-30 19:01:11
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> lea指令变种(按大小分类): leaw #2个字节 leal #4个字节 leaq #8个字节 lea的用法: leaq a(b, c, d), %rax 首先lea指令是mov指令的变种,据说,lea指令是x86体系结构中,是一条最古老但是从某个方面来讲又是最神奇的指令。 表面上看,它做的事情非常简单,根据括号里的源操作数来计算地址,然后把地址加载到目标寄存器中。 例如:leaq a(b, c, d), %rax 先计算地址a + b + c * d,然后把最终地址载到寄存器rax中。 最逗的是leaq不引用源操作数里的寄存器,只是单纯的计算。那这样的完全可以把它当作乘法指令使用。 例如: rbx * 2 movq $8, %rbx leaq (, %rbx, 2), %rax rbx * 3 movq $8, %rbx leaq (%rbx, %rbx, 2), %rax rbx * 3 - 1 movq $8, %rbx leaq -1(%rbx, %rbx, 2), %rax 什么时候用lea指令: 在打算用五六条指令来完成某个乘法运算之前,看看能否通过两三条lea指令来代替它。 注意事项: d的取值范围是1,2,4,8(64位cpu) 来源: oschina 链接: https://my

LEA指令的目的是什么?

江枫思渺然 提交于 2019-12-30 18:54:22
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 对我来说,这就像一部时髦的MOV。 它的目的是什么?何时使用? #1楼 8086具有大量的指令集,它们接受寄存器操作数和有效地址,执行一些计算以计算该有效地址的偏移量部分,并执行一些涉及寄存器和所计算地址所指向的存储器的操作。 让该系列中的指令之一按上述方式操作非常简单,只是跳过了实际的内存操作。 这个,说明: mov ax,[bx+si+5] lea ax,[bx+si+5] 在内部几乎完全相同。 区别是跳过的步骤。 两种指令的工作方式如下: temp = fetched immediate operand (5) temp += bx temp += si address_out = temp (skipped for LEA) trigger 16-bit read (skipped for LEA) temp = data_in (skipped for LEA) ax = temp 至于为什么英特尔认为该指令值得包括在内,我不确定,但是实施起来便宜的事实将是一个很大的因素。 另一个因素可能是英特尔的汇编器允许相对于BP寄存器定义符号的事实。 如果将 fnord 定义为BP相对符号(例如BP + 8),则可以说: mov ax,fnord ; Equivalent to "mov ax,[BP+8]"

cmake基础指令 cmakelist.txt编写

天涯浪子 提交于 2019-12-30 16:05:22
主体框架: 工程配置部分:工程名,编译调试模式,编译系统语言 依赖部分:工程包,头文件,依赖库等 其他辅助:参数打印,遍历目录等 判断控制部分:条件判断,函数定义,条件执行等 源文件(.h , .cpp等) ——> 预编译——>编译——>汇编——>链接——>可执行文件 静态库:链接阶段,库中目标文件所含的所有将被程序使用的函数的机器码,被copy到最终的可执行文件中。 特点 1.静态库对函数库的链接是放在编译时期完成的; 2.程序在运行时与函数库再无瓜葛, 移植方便; 3.运行效率相对快; 4.占用磁盘和内存空间,因为所有相关的目标文件与牵涉到的函数库被链接合成一个可执行文件。 静态库的局限性: 1.空间浪费是静态库的一个问题; 2.静态库对程序的更新、部署和发布页会带来麻烦; 3.如果静态库lib更新了,所以使用它的应用程序都需要重新编译、发布给用户; 4.对于玩家来说,可能是一个很小的改动,却导致整个程序重新下载,全量更新。 5.若静态库占用1M内存,有2000个这样的程序,将占用近2G的空间。 动态库:程序编译时并不会被连接到目标代码中,而是在程序运行是才被载入。 特点 1.可执行文件只包含它需要的函数的引用表,而不是所有的函数代码; 2.只有在程序执行时, 那些需要的函数代码才被拷贝到内存中。 3.动态库在程序运行是才被载入,也解决了静态库对程序的更新

HITICS-2019大作业报告

女生的网名这么多〃 提交于 2019-12-30 01:24:03
计算机系统 大作业 题 目 程序人生-Hello’s P2P 专 业 计算机类 *指 导 教 师 吴锐   * 计算机科学与技术学院 2019年12月 摘 要 当hello world这个句子显示在电脑上时,标志着世界上第一个程序的诞生。然而很多人都认为让hello world显示在屏幕上是一件很简单的事。殊不知,这个程序的所有执行周期却经历了很多阶段,当然,计算机科学家们在这个程序执行之前也做了大量的铺垫。所以,当我们研究hello world程序的整个生命周期时,我们发现这个程序是不平凡的,我们也理解了计算机科学家们的执着与智慧。从开始对这个程序的编码,再到预处理,编译的高级语言阶段。再到汇编成机器语言,转换成机器码。再进行链接生成可执行文件,再执行。在此过程中,CPU,操作系统,内存,磁盘等计算机的重要组成部分都有条不紊的相互协调工作,其中又产生了进程的创建与回收、异常处理、内存管理等后台。这些后台过程都默默地支持着程序的执行。本篇论文来告诉你hello world被打印在电脑屏幕里所要经历的所有过程。 **关键词:**程序 编码 执行 进程管理 储存管理 目 录 第1章 概述 - 4 - 1.1 Hello简介 - 4 - 1.2 环境与工具 - 4 - 1.3 中间结果 - 4 - 1.4 本章小结 - 4 - 第2章 预处理 - 5 - 2.1 预处理的概念与作用 -

接口与总线 考点整理

删除回忆录丶 提交于 2019-12-29 23:11:06
说明 以下内容为个人整理,答案也是个人回答,不一定对,所以你对答案有任何问题,都欢迎与我讨论。 Q01:51单片机P0、P1、P2、P3口功能作用? 答: P0可做地址口的低8位也可以做数据口和I/O口 P1可做普通的I/O口 P2除了做I/O口,也是作为地址口的高8位(总共16位) P3 既可以是普通IO口,也可以是外部中断、定时、外部输入的端口 Q02:当串口发送一个数据或接收数据时,哪两个位会置位? 答: 接收数据时,RI 会置位 发送数据时,TI 会置位 Q03:81单片机的累加器是什么? 答: ACC Q04:当晶振频率为12MHz,定时器的频率为多少? 答: 频率为1Mhz 说明: 机器频率 = 晶振频率/12 Q05:LED的显示分为几种? 答: 两种,动态扫描和静态扫描 说明: 动态扫描中LED的调度是放在定时器中 Q06:51单片机内存划分 答: 低128个字节 从00H~1FH(32字节):寄存器区,四组寄存器区,一组有8个寄存器 从20H~2FH(16字节 128位):位寻址区 剩下:普通内存 高128个字节 特殊功能寄存器 Q07:ex0、ex1、et0的含义 答: ex0 = 1; //允许外部中断0 ex1 = 1; //允许外部中断1 et0 = 1; //允许定时器0中断 1 2 3 说明: 在这里插入图片描述 上图为IE(中断允许寄存器) EA

单核,多核CPU的原子操作

不羁岁月 提交于 2019-12-29 02:35:30
一. 何谓"原子操作": 原子操作就是: 不可中断的一个或者一系列操作, 也就是不会被线程调度机制打断的操作, 运行期间不会有任何的上下文切换(context switch). 二. 为什么关注原子操作? 1. 如果确定某个操作是原子的, 就不用为了去保护这个操作而加上会耗费昂贵性能开销的锁. - (巧妙的利用原子操作和实现无锁编程) 2. 借助原子操作可以实现互斥锁(mutex). (linux中的mutex_lock_t) 3. 借助互斥锁, 可以实现让更多的操作变成原子操作. 三. 单核CPU的原子操作: 在单核CPU中, 能够在一个指令中完成的操作都可以看作为原子操作, 因为中断只发生在指令间. 四. 多核CPU的原子操作: 在多核CPU的时代(确实moore定律有些过时了,我们需要更多的CPU,而不是更快的CPU,无法处理快速CPU中的热量散发问题), 体系中运行着多个独立的CPU, 即使是可以在单个指令中完成的操作也可能会被干扰. 典型的例子就是decl指令(递减指令), 它细分为三个过程: "读->改->写", 涉及两次内存操作. 如果多个CPU运行的多个进程在同时对同一块内存执行这个指令, 那情况是无法预测的. 五. 硬件支持 & 多核原子操作: 软件级别的原子操作是依赖于硬件支持的. 在x86体系中, CPU提供了HLOCK pin引线,