汇编指令

CMP指令与JCC指令总结

久未见 提交于 2020-02-02 03:02:31
之前看到了cmp指令,总是记混。现在准备对CMP指令和汇编条件的判断做一个简单的总结。 CMP指令 cmp(compare)指令进行比较两个操作数的大小 例:cmp oprd1,oprd2 当执行到CMP指令的时候会读取这两个寄存器的内容,并加以 减法 运算,结果本身不保留,并按照结果设置符号位(属算术运算)。 如何判断大小 若执行指令后:ZF=1,则说明两个数相等,因为zero为1说明结果为0. 当无符号时: 若CF=1,则说明了有进位或借位,cmp是进行的减操作,故可以看出为借位,所以,此时oprd1<oprd2; CF=0,则说明了无借位,但此时要注意ZF是否为0,若为0,则说明结果不为0,故此时oprd1>oprd2. 当有符号时: 若SF=0,OF=0 则说明了此时的值为正数,没有溢出,可以直观的看出,oprd1>oprd2; 若SF=1,OF=0 则说明了此时的值为负数,没有溢出,则为oprd1<oprd2; 若SF=0,OF=1 则说明了此时的值为正数,有溢出,可以看出oprd1<oprd2; 若SF=1,OF=1则说明了此时的值为负数,有溢出,可以看出oprd1>oprd2; 最后两个可以作出这种判断的原因是,溢出的本质问题: 两数同为正,相加,值为负,则说明溢出 两数同为负,相加,值为正,则说明溢出 故有,正正得负则溢出,负负得正则溢出

20165217第四周学习总结

﹥>﹥吖頭↗ 提交于 2020-02-01 10:01:28
教材学习内容总结 Y86-64指令:Y86-64指令是x86-84指令集的一个子集。它只包括8字节整数操作。有4个整数操作指令:addq、subq、andq和xorq。有7个跳转指令:jmp、jle、jl、je、jne、jge和jg。有6个条件传送指令:cmovle、cmovl、cmove、cmovne、cmovge和cmovg。 程序员可见的状态:Y86-64程序中的每条指令都会读取或修改处理器状态的某些部分,这称为程序员可见状态。包括:程序寄存器、条件码、程序状态、程序计数器和内存。 程序寄存器(RF): %rax,%rsp,%r8,%r12,%rcx,%rbp,%r9,%r13,%rdr,%rsi,%r10,%r14,%rbr,%rdi,%r11; 条件码:ZF\SF\OF; 结果为0,ZF = 1; 结果最高位即SF; 无符号运算无意义,发生溢出,OF = 1; Y86-64指令集: Y86-64程序寄存器标识符: Y86-64指令集的功能码: 上周考试错题总结 错题1: Linux汇编中,销毁栈帧的语句是( ) A . movq %rbp, %rsp popq %rbp B . leave C . enter D . pushq %rbp movq %rsp, %rbp 答案:A B 解析:leave等价于: movq %rbp, %rsp popq %rbp 错题2:

csapp-系统栈和ROP技术

无人久伴 提交于 2020-02-01 05:19:47
前言:总结的都是基于我在计算机系统学习中的相对个人重难点。 栈帧 栈帧的内部模拟图片( 来源于百度图片 ): 图上所述结构一步一步来看: 返回地址以上部分的参数是存储在调用函数p中的栈帧中的变量值。而这个值是为下一步被调函数Q传参做准备的。需要注意的是,存在该部分的条件是因为寄存器中最多传递六个整型(即整型和指针参数)。而当传入的个数大于6时,超过六的部分参数,需要直接存储在栈帧中,并且是倒着顺序存入栈帧中(由栈顶到栈底顺序)。 补充栈上的局部存储: 1:寄存器不够存放所有的本地数据; 2:对某一个局部变量使用地址运算符“&”,必须为它产生一个地址; 3:某些局部变量数数组或者结构时。 引用《深入了解计算机系统》书上的两个例子: 第一个: 在long caller函数调用被调函数swap之前,开辟空间,将arg1和arg2先放入栈中,并且rsp存着&arg1,rsp+8存着&arg2,然后再将返回地址放入栈中,进行调用函数swap_add。 第二个 发现传入的参数的个数是8个,并且存在几个参数传入的地址,那么我们首先选出地址引用的&x1,&x2,&x3,&x4和第七个x4与第八个参数&x4.那么如上图根据“对某一个局部变量使用地址运算符“&”,必须为它产生一个地址”原则,为x1,x2,x3,x4按顺序产生地址,然后第七个和第八个参数就按照倒序的顺序存入即可x4存在rsp,

第六周学习报告

筅森魡賤 提交于 2020-02-01 02:55:32
4.1Y86指令体系结构 程序员可见状态 ISA: 一个处理器支持的指令和指令的字节级编码称为~。 冒险: 一条指令的位置或者操作数依赖于其他仍在流水线中的指令。 程序员可见状态: Y86程序中的每条指令都会读取或修改处理器状态的某些部分 =>只要我们保证机器级程序能够访问程序员可见状态,就不需要完全按照ISA隐藏方式来表示和组织这个处理器状态。 Y86的处理器状态类似于IA32。 有8个程序寄存器。处理器每个程序寄存器储存一个字。寄存器%esp被入栈,出栈,调用和返回指令作为栈指针。 有3个一位条件码:ZF,SF, OF.保存最近的算术或者逻辑指令所造成影响的有关信息。 程序计数器PC:存放当前正在执行指令的地址。 存储器:(概念上来说是一个很大的字节数组)保存着程序和数据。Y86程序用虚拟地址来引用存储器位置。 程序状态的最后一部分状态码Stat,表明程序执行总体状态。 Y86指令 只包括四字节整数操作,所以称之为“字 ”。 Y86指令集,长度1~6字节不等。一条指令含有一个单字节的指令表示符,可能含有一个单字节的寄存器指示符,还可能含有一个四字节的常数字。 字段fn:指明是某个整数操作(OPL),数据移动条件(comvxx)或是分支条件(jxx)。所有数值都使用16进制。 Y86指令的更多细节: movl指令分成了四个不同的指令irmovl,rrmovl

20145235 《信息安全系统设计基础》第06周学习总结 _01

霸气de小男生 提交于 2020-02-01 02:03:28
20145235 《信息安全系统设计基础》第06周学习总结 _01 4.1.4 Y86异常 关于可见状态码Stat的几个值: 1:AOK 程序执行正常 2:HLT 表示处理器执行了一条halt指令 3:ADR 表示处理器从一个非法的存储器地址读或者向一个非法的存储器地址写 4:INS 表示遇到非法指令 4.1.5 Y86程序 “.”开头的词是汇编器命令,告诉他们汇编器调整命令,以便在哪产生代码或者插入数据 P239 Y86程序结构: 声明代码产生的起始地址 (.pos 0 ) 初始化栈指针和帧指针 为代码所声明的数据开辟地址 给栈分配空间 指令模拟器,成为YIS。 模拟器只打印出在模拟过程中被改变了的寄存器或存储器中的字。左边是原始值,右边是最终值。 4.1.6 对于“pushl %esp”在上学期的汇编中有详细指明:是现将数据push,然后对指针sp进行修改;而对于“popl %esp”,是先修改指针,然后再进行pop。然而4.1.6中说是不确定的。 4.2 逻辑设计和硬件控制语言HCL 要实现数字系统,需三个主要组成部分: 计算对位进行操作的逻辑结构、存储位的存储器元素,以及控制存储器元素更新的时钟信号。 4.2.1 逻辑门 逻辑运算:&&、||、! 位运算:&、|、~ 4.2.2 组合电路和HCL布尔表达式 将很多逻辑门组合成一个网,就能构建计算快,称为组合电路。限制

20155212 2017-2018-1 《信息安全系统设计》第7周学习总结

北城以北 提交于 2020-02-01 01:10:17
20155212 2017-2018-1 《信息安全系统设计》第7周学习总结 教材学习内容总结 Chapter 4 定义一个指令集包括 状态单元 指令集 编码 编程规范 异常事件处理 程序员可见状态:每条指令都会读取或修改处理器状态的某些部分 状态码Stat:表明程序执行的总体状态 执行字级计算的组合电路根据输入字的各个位,用逻辑门来计算输出字的各个位 组合电路从本质上讲,不存储任何信息,只是简单地响应输入信号,产生等于输入的某个函数的输出 处理 取指——PC增加器:从内存读取指令字节,地址为PC的值。从指令中抽取出指令指示符的两个四位部分 icode (指令代码)和 ifun (指令功能) 译码——读端口A和B:从寄存器文件读入最多两个操作数,得到值valA和/和valB 执行——ALU、CC:ALU,要么执行指令指明的操作(根据ifun),计算内存引用的有效地址,要么增加或减少栈指针。该阶段决定分支。 访存——内存:读写数据 写回——两个写端口:最多可以写两个结果到寄存器文件 更新PC——PC:将PC设置成下一条指令的地址 处理器停止的异常:执行halt指令或非法指令、或试图读/写非法地址 除了ALU计算必须根据ifun中编码的具体的指令操作来设定 组织计算原则:从不回读 SEQ阶段实现 取指阶段 译码和写回阶段 执行阶段 访存阶段 更新PC阶段 引入流水线能获得更好的性能

x86 汇编的基础知识

北慕城南 提交于 2020-01-31 05:33:12
x86 汇编器编程 基于x86 实现编译器首先得了解x86 平台的指令调度, 以下是一些我在实现编译器过程中用到的基础知识! 大部分内容参考了 青木的自制编译器, 基于GNU汇编器 c语言使用gcc 编译, 而gcc 编译器将c代码转化为汇编之后, 也是用的GNU as 的汇编器将汇编语言 .s 转化为.o,然后再连接, 因此如果自制编译器, 也是做到汇编这一步, 所以又得学x86 汇编器的使用方法! gcc 用的 GNU, 那我就直接使用gcc! 基本使用 编译: as hello.s //默认生成 a.out 也可以指定名字: as - o hello . o hello . s 生成目标文件后还要连接才可以执行。 gcc hello.o -o hello 最后就是 . / hello 语法 指令 指令包括 助记符 和 操作数 组成,比如 movl %esp, %ebp , movl 助记符, 后面两个为操作数, 操作数可以为多个!逗号分隔。 这个是由cpu直接执行的指令 汇编伪操作 以点 “.” 开头的, 末尾没有冒号 “:” 的 行 都是汇编伪操作行。 由汇编器执行,记录元数据和设定指令的属性。 汇编的首行缩进是没有影响的 标签 以冒号“:” 结尾的 行 都是标签行 冒号是语法, 标签名为冒号前面的值。 一般命名加上 . ,避免和代码里面的名字重复。 助记符后缀 后缀 大小

汇编,寄存器,内存,mov指令

╄→гoц情女王★ 提交于 2020-01-30 20:56:12
一.代码 和 汇编 和 二进制之间的关系 二.复习一下计算机组成原理的知识 1.寄存器 计算机中有三个存储 32位cpu提供的寄存器有三种类型8位 16位 32位 64位的只是32位的扩展 并且程序大多是32位 以下是32位的8个通用寄存器(有宽度) 2.MOV指令 mov eax ,1(向eax寄存器存1) mov edx , eax(把edx里面的值存到eax ) 例子: EAX:32位通用寄存器 假如FFFFFFFF 一个F(16进制)化为2进制 1111,也就是4位 所以为什么叫32(四个字节) ? 4*8=32 三.内存 1.内存 内存空间和物理内存都不是内存条!物理内存和内存条之间还有一层映射关系。   下面的话其实并不是真正的给每一个进程分了4g的内存条,等进程 真正要去写/读内存的时候就把4g内存映射到物理内存上去。    2.内存地址 内存太多起不了名字 只能用编号。 每一行的内存编号代表一个字节 3.mov指令向内存写数据 与往寄存器里面写是不一样的 内存 eax32位 ax16位 他是自带数据宽度的, 而内存不一样,内存是连起来的一大片 所以 ! 不同点:向内存写的时候必须明确告诉其宽度。 byte = 1字节 word = 2字节 dword = 4字节 <1> 那么就有一个问题,就是一行的内存地址编号是一个字节。 现在村的数据是四个字节,那么可行吗? 可行

一点一点学汇编2

ε祈祈猫儿з 提交于 2020-01-30 05:54:32
寄存器 这回我们来看寄存器。CPU是由运算器,控制器,寄存器这些个器件组成。 运算器 主要负责数据的各种数据的处理工作,比如算数运算,逻辑运算; 控制器 是根据给出的相应的机器指令,发出对应的具体控制信号驱动硬件工作。它有指令译码的工作,就是根据指令寄存器的内容,产生相应的微指令; 加法指令的执行可分为:取指,计算地址,取操作数和加法运算四步,每一步都由一组微操作实现.这一组能同时执行的微操作就构成一条微指令。 寄存器 则是CPU中存储数据的部件。对于一个汇编程序员,CPU中最重要的部件就是寄存器。通过对各个寄存器数据的改变,完成对于CPU的控制。不同的CPU,寄存器的结构,数量是不同的。比如,8086CPU中有14个寄存器,名称分别是:AX,BX,CX,DX,CS,DS,ES,SS,IP,SP,BP,SI,DI,PSW。我们不在这里一一介绍每个寄存器的功能,以后用到什么寄存器,就学习什么。大体上我会按照书上的顺序来写这些寄存器。 上述这些个器件,全部集成到了一个CPU芯片中。CPU中数据的传输通过 内总线 进行。前面一篇提到了总线,那个总线是指 外总线 ,是用来连接CPU和主板上的其他部件的。 ----------------------------------------------------------------------------------------------

新的开始——LED灯汇编机器码的点亮方式

生来就可爱ヽ(ⅴ<●) 提交于 2020-01-30 05:38:45
在几个月前看2440视频的时候,发现太多知识欠缺,购买开发板期间补习makefile,linux,arm汇编和arm构架之后,现在重新开始学习。 先看板子LED硬件连接图: 可以看到LED 1,2,4连接GPF4,5,6。故,查看芯片手册GPF IO口: 有寄存器地址,有对应位的功能,剩下的就是我们的编程了。 写在前面:基本汇编拾遗 Load/Store 内存访问指令: LDR:字 数据读取指令 LDRB:字节读取指令 LDR R0,[R1];把内存单元R1中的数据读取到R0寄存器中 。。。LDR,STR还有很多后缀的指令不详举例了,以后用到再说明 STR:字数据写入指令 STRB:字节数据写入指令 STR R0,[R1,#0X100];把R0中的数据保存到内存单元(R1+0X100)中 B:跳转 MOV:移动 MOV R1,R0;把R0的值赋值给R1 伪指令:LDR(上面一个LDR的用法是汇编指令,但是LDR也可以是伪指令) LDR R0,=0X1234;表示把0x1234赋值给R0,你可能会想,MOV不就可以达到效果了吗? 但是,MOV只能处理立即数,当我们不能保证一个数是否是立即数的时候,请使用LDR伪指令。 关于什么样的数才能算是立即数,可以参考ARM体系结构 P24对立即数的叙述。 简单介绍一下: 每个立即数由一个8位的常数循环右移偶数位得到