汇编指令

2019-2020 20191316《信息安全专业导论》第五周学习总结

此生再无相见时 提交于 2019-12-03 09:54:36
教材学习内容总结 这一周学习了各种指令格式,并在Pep/8上运行了小程序。知道了汇编语言。认识了伪代码,知道了如何测试程序 教材学习中的问题和解决过程 问题1:想多了解一下汇编语言及各种语言进化过程 解决方案:通过查资料我知道了早期的程序设计均使用机器语言。程序员们将用0, 1数字编成的程序代码打在纸带或卡片上,1打孔,0不打孔,再将程序通过纸带机或卡片机输入计算机,进行运算。但由于用机器语言编写程序,编程人员要首先熟记所用计算机的全部指令代码和代码的涵义。手编程序时,程序员得自己处理每条指令和每一数据的存储分配和输入输出,还得记住编程过程中每步所使用的工作单元处在何种状态。这是一件十分繁琐的工作。编写程序花费的时间往往是实际运行时间的几十倍或几百倍,而且,编出的程序全是些0和1的指令代码,直观性差,如果有错写也很难查找。所以汇编语言诞生了。汇编语言的主体是汇编指令。汇编指令和机器指令的差别在于指令的表示方法上,汇编指令是机器指令便于记忆的书写格式。我们用汇编语言编写程序,但计算机只认识机器指令,这时候就需要一个能将汇编语言转换成机器指令的工具,就是编译器。程序员用汇编语言写出源代码,再用汇编编译器将其编译为机器码,最后由计算机执行。 汇编语言是直接面向处理器(Processor)的程序设计语言。处理器是在指令的控制下工作的,处理器可以识别的每一条指令称为机器指令

2019-2020-1 20191315 《信息安全专业导论》第五周学习总结

拜拜、爱过 提交于 2019-12-03 09:49:15
教材学习内容总结 第六章新学习了计算机能够存储、检索和处理数据。用户可以把数据输人计算机,计算机能够显示数据,使用户看到它们。在最底层抽象中,给机器的指令直接反映了这5种操作。计算机的机器语言是一套机器的硬件能够识别并执行的指令。机器语言程序是-系列用二进制编写的指令。Pep/8 是一台具有寄存器A和两部分指令的虚拟机,一部分指令说明要执行的动作,另一部分指令说明了要使用的数据的位置。使用Pep/8指令集编写的程序可以使用模拟器运行。Pep/8汇编语言是种使用助记忆码而不是二进制数表示的指令。用汇编语言编写的程序将被翻译成等价的机器语言,然后用Pep/8模拟器执行。伪代码是人们为了表示算法而使用的一种便捷形式的语言, 允许用户命名变量(存放值的空间)、把数值输人变量以及输出存储在变量中的值。使用伪代码还可以描述重复执行或选择的动作的算法。在算法设计中,问问题和推迟细节是用到的两种解决问题的策略。与算法一样,程序也需要测试。代码覆盖测试法通过仔细检查程序的代码来决定程序的输人。数据覆盖测试法则通过考虑所有可能的输人值来决定程序的输人。 教材学习过程中遇到的问题及解决 问题一:在写伪代码的算法主要的策略是什么 问题一的解决过程:我们问了问题并推迟了细节。问向题是我们大多数人都熟悉的策略。推迟细节则是首先给任务-个名称, 然后再补充细节来完成这个任务。也就是说,我们首先用more

汇编一

為{幸葍}努か 提交于 2019-12-03 08:12:22
1: 基本结构 DATAS SEGMENT ;此处输入数据段代码 DATAS ENDS STACKS SEGMENT ;此处输入堆栈段代码 STACKS ENDS CODES SEGMENT ASSUME CS:CODES,DS:DATAS,SS:STACKS ;段寻址伪指令用来指明段与段寄存器的对应关系 START: MOV AX,DATAS MOV DS,AX ;此处输入代码段代码 MOV AH,4CH ; INT 21H ; dos系统调用系统终端 执行AH程序中程序退出指令 CODES ENDS END START ; 指定开始的地址 2:基本指令    一、数据传送指令 1、传送指令:MOV (move) (1) CPU内部寄存器之间的数据传送,如:mov ah,al (2) 立即数送至通用寄存器(非段寄存器)或存储单元,如:mov al,3 mov [bx],1234h (3) 寄存器与存储器间的数据传送,如:mov ax,var mov ax,[bx] 二、堆栈操作指令 1、进栈指令:push 格式:push src 功能: 把16位数据src压入堆栈。 注: 源操作数src可以是通用寄存器和段寄存器,也可以是字存储单元 如: push si push [si] push var ;var是16位(字)变量 2、出栈指令:pop 格式:pop dst 功能

Linux服务器开发:工具

自作多情 提交于 2019-12-03 04:14:27
预处理 将所有#defined删除,并且展开 处理所有条件预处理指令 处理#include,将被包含的文件插入到该预编译指令的位置 过滤所有的//、/**/ 保留所有#pragma编译指令 编译 词法分析 语法分析 语义分析 代码分析 目标代码生成 汇编 链接 静态链接 动态链接 来源: https://www.cnblogs.com/zsczsc/p/11776480.html

第二次读汇编语言

南楼画角 提交于 2019-12-03 02:53:38
第一次读汇编语言的教材就是那本Kip Irvine dalao写的书, 比较急,因为赶着完成作业,只能囫囵吞枣了. 而最近用到汇编写点东西的时候总是感觉不是那么顺心, 于是就重新读了一遍基础知识,现在还只是读到了第三章(汇编语言基础知识), 大概这几天就会把这本书多翻阅几遍,以此来达到复习,提高的效果; 闲话少说,接下来就是我新发现的"知识点": 1. 以字母开头的十六进制数,必须加一个前置0 ,以防汇编器将其解释为标识符 2. 整形常量表达式只是在汇编时计算,同样的还有 伪指令 会有汇编器在汇编阶段将其汇编为相应的代替物 3. 预定义符号 如@data ,汇编时返回常量的整数值 4. 指令: [label:] mnemonic [operation] [;comment] 这是一个完整的指令的 ''原型''; 5. NOP指令 ------空指针 ,主要用处是为对其地址, Intel的芯片 在访问偶数的地址会快点. 6. 可执行文件 executable file 7. list 文件 地址 从程序内存起点算起(类似于段地址和偏移地址中的偏移地址) 8. db dw dd dq dt 是伪指令 10 BCD数据 Binary coded Decimal (二进制编码的十进制) 来源: https://www.cnblogs.com/love-coding/p/11774717

volatile关键字解析

匿名 (未验证) 提交于 2019-12-03 00:40:02
这个可见性是指,当一个线程读取volatile修饰的变量时,永远读取的都是最后一个线程写回主内存的最新值,某个线程在读取数据之后,其他线程对变量值做了修改,这个线程是不知道的,这就导致当前线程读取的值是过期的,当前线程将过期的数据经过计算写会主内存时,就会出现问题。看下面代码: public class VolatileTest { public static volatile int race = 0; /** * 每次都对race累加 */ public static void increase() { race++; } private static int THREAD_COUNT = 20; public static void main(String[] args) { // start 20 thread, every thread invoke increase function 20 times for (int tCount = 0; tCount < THREAD_COUNT; tCount++) { new Thread(() -> { for (int i = 0; i < 10000; i++) { increase(); } System.out.println(Thread.currentThread().getName() + "is

多周期CPU设计与实现

匿名 (未验证) 提交于 2019-12-03 00:39:02
设计一个多周期CPU,该CPU至少能实现以下指令功能操作。指令与格式如下: ==> 算术运算指令 1. add rd , rs, rt (说明:以助记符表示,是汇编指令;以代码表示,是机器指令) 000000 rs(5λ) rt(5λ) rd(5λ) reserved 功能:rd←rs + rt。reserved为预留部分,即未用,一般填“0”。 2. addi rt , rs ,immediate 000010 rs(5λ) rt(5λ) immediate(16λ) 功能:rt←rs + (sign-extend)immediate;immediate符号扩展再参加“加”运算。 3. sub rd , rs , rt 000001 rs(5λ) rt(5λ) rd(5λ) reserved 功能:rd←rs - rt ==> 逻辑运算指令 4. ori rt , rs ,immediate 010010 rs(5λ) rt(5λ) immediate(16λ) 功能:rt←rs | (zero-extend)immediate;immediate做“0”扩展再参加“或”运算。 5. and rd , rs , rt 010001 rs(5λ) rt(5λ) rd(5λ) reserved 功能:rd←rs & rt;逻辑与运算。 6. or rd , rs , rt

C++11中memory_order_consume的目的

匿名 (未验证) 提交于 2019-12-03 00:29:01
原文: The Purpose of memory_order_consume in C++11 在C++11标准原子库中,大多数函数接收一个memory_order参数: enum memory_order { memory_order_relaxed, memory_order_consume, memory_order_acquire, memory_order_release, memory_order_acq_rel, memory_order_seq_cst }; 上面的值被称为 内存顺序约束 。每一个都有自己的目的。在它们之中,memory_order_consume很可能是最少被正确理解的。它是最复杂的排序约束,也最难被正确使用。尽管如此,然而还是吸引着好奇的程序员去弄懂它--或者只是想解开它的神秘面纱。这就是这篇文章的目的所在。 首先,让这个术语直白着:一个使用memory_order_consume的操作具有 消费语义 (consume semantics)。我们称这个操作 为消费操作 (consume operations)。 也许对于memory_order_consume最的价值的观察结果就是总是可以安全的将它替换成memory_order_acquire。那是因为 获取操作 (acquire operations)提供了消费操作(consume

Volatile详解

匿名 (未验证) 提交于 2019-12-03 00:21:02
之前研究了一下内存模型,java内存模型中很关键的一点就是Volatile,现在跟大家探讨一下Volatile的知识吧 1.volatile关键字的两层语义   一旦一个共享变量(类的成员变量、类的静态成员变量)被volatile修饰之后,那么就具备了两层语义:   1)保证了不同线程对这个变量进行操作时的可见性,即一个线程修改了某个变量的值,这新值对其他线程来说是立即可见的。   2)禁止进行指令重排序。   先看一段代码,假如线程1先执行,线程2后执行: 这段代码是很典型的一段代码,很多人在中断线程时可能都会采用这种标记办法。但是事实上,这段代码会完全运行正确么?即一定会将线程中断么?不一定,也许在大多数时候,这个代码能够把线程中断,但是也有可能会导致无法中断线程(虽然这个可能性很小,但是只要一旦发生这种情况就会造成死循环了)。   下面解释一下这段代码为何有可能导致无法中断线程。在前面已经解释过,每个线程在运行过程中都有自己的工作内存,那么线程1在运行的时候,会将stop变量的值拷贝一份放在自己的工作内存当中。   那么当线程2更改了stop变量的值之后,但是还没来得及写入主存当中,线程2转去做其他事情了,那么线程1由于不知道线程2对stop变量的更改,因此还会一直循环下去。   但是用volatile修饰之后就变得不一样了:   第一

浅谈汇编(2)――堆栈指令

匿名 (未验证) 提交于 2019-12-03 00:18:01
8086CPU提供入栈和出栈指令: (最基本的) PUSH(入栈) push ax:将寄存器ax中的数据送入栈中; POP (出栈) pop ax :从栈顶取出数据送入ax。 8086CPU的入栈和出栈操作都是以 字 (两个字节)为单位进行的。 8086CPU中,有两个寄存器: 段寄存器SS  存放栈顶的段地址 寄存器SP  存放栈顶的偏移地址 任意时刻,SS:SP指向栈顶元素。 问题:如果我们将10000H~1000FH 这段空间当作栈,初始状态栈是空的,此时,SS=1000H,SP=? 答:SP = 0010H 我们将10000H~1000FH 这段空间当作栈段,SS=1000H,栈空间大小为16 字节 ,栈最底部的字单元地址为1000:000E。  任意时刻,SS:SP指向栈顶,当栈中只有一个元素的时候,SS = 1000H,SP= 000EH 。 push ax(入栈) (2)将ax中的内容送入SS:SP指向的内存单元处,SS:SP此时指向新栈顶。 pop ax (1)将SS:SP指向的内存单元处的数据送入ax中; (2)SP = SP+2,SS:SP指向当前栈顶下面的单元,以当前栈顶下面的单元为新的栈顶。 push 指令的执行过程 pop指令的执行过程 注意: 出栈后,SS:SP指向新的栈顶1000EH,pop操作前的栈顶元素,1000CH 处的2266H 依然存在