汇编第六日

flag寄存器:

ZF=1表示计算结果为0,反之

PF = 0表示计算结果二进制表示中1的个数为奇数,反之

SF = 0表示计算结果为正,反之

CF为1,在加法中表明结果出现仅为,在减法中表明结果出现借位,反之

OF = 1表示计算结果溢出,反之

对于无符号数,CPU用CF位记录计算结果是否产生进位

对于有符号数,CPU用OF位记录计算结果是否产生溢出

两者计算结果都用SF位记录符号

adc指令:带进位加法指令

例如:

sbb指令:带借位指令

sbb ah 0:(ah) = (ah) - 0 - (cf)

cmp ax, bx指令

实际上执行了(ax)-(bx),但是结果并不保存在ax中仅仅改变标志寄存器中相应的位

若 ax=bx 那么ZF = 1;反之

但是对于cmp ax, bx后发现SF = 1,即结果符号为负,能否说明(ax) < (bx)?

否,例如对于有符号数,ah = 22H(补码表示34),bh = 0A0H(补码表示-96)

(ah) - (bh) = 34 - (-96) = 130 = 82H,82H是-126的补码,所以SF = 1,但是ah明显大于bh

要考虑OF和SF得两者大小:

1.对于无符号数cmp,要检查ZF,CF位

2.对于有符号数cmp,要检查SF,OF,ZF位

对于标识寄存器中位的jmp指令,该指令可以配合cmp(无符号数)使用,cmp比较之前两对象大小会修改flag寄存器中对应位,之后使用对应的jmp指令实现跳转

je(e:equal,表明上面cmp两对象相等):ZF = 1转移,反之

jne(ne:not equal,表明上面cmp两对象不相等,下同):ZF = 0转移,反之

jb:CF  = 1转移,反之

jnb:CF  = 0转移,反之

ja:CF  = 1,ZF = 0转移,反之

jna:CF  = 1或ZF = 1转移,反之

DF标志位

DF = 0 si和di寄存器内容会递增1

DF = 1 si和di寄存器内容会递减1

例如:

movsb指令:以字节单位传递数据

实现:((es)*16+(di)) = ((ds)*16+(si))

之后如果DF = 0,di和si内容加1(1个内存单元);反之

movsw指令:以单位传递数据

实现:((es)*16+(di)) = ((ds)*16+(si))

之后如果DF = 0,di和si内容加2(2个内存单元);反之

rep movsb指令:

根据cx寄存器中字数,反复执行“movsb” (cx)次,实现(cx)个字节传递

cld指令:将DF置为0(clear)

std指令:将DF置为1(set)

pushf指令:将标志寄存器内容压栈

popf指令:将栈顶内容弹出到标识寄存器

中断处理程序一直存在内存中,以防止CP随时调用

iret指令:将返回到中断前进程执行(将CS:IP出栈,flag出栈)

mov ax, 8 - 4 = mov ax, 4

设置TF = 1将产生单步中断,CPU将当前进程执行一条指令,之后去执行单步中断的中断处理程序(例如debug)

Done!!!

时间: 2024-10-15 14:48:48

汇编第六日的相关文章

GCC在C语言中内嵌汇编 asm __volatile__ 【转】

转自:http://blog.csdn.net/pbymw8iwm/article/details/8227839 在内嵌汇编中,可以将C语言表达式指定为汇编指令的操作数,而且不用去管如何将C语言表达式的值读入哪个寄存器,以及如何将计算结果写回C 变量,你只要告诉程序中C语言表达式与汇编指令操作数之间的对应关系即可, GCC会自动插入代码完成必要的操作. 1.简单的内嵌汇编 例: __asm__ __volatile__("hlt"); "__asm__"表示后面的

Linux C中内联汇编的语法格式及使用方法(Inline Assembly in Linux C)

在阅读Linux内核源码或对代码做性能优化时,经常会有在C语言中嵌入一段汇编代码的需求,这种嵌入汇编在CS术语上叫做inline assembly.本文的笔记试图说明Inline Assembly的基本语法规则和用法(建议英文阅读能力较强的同学直接阅读本文参考资料中推荐的技术文章 ^_^). 注意:由于gcc采用AT&T风格的汇编语法(与Intel Syntax相对应,二者的区别参见这里),因此,本文涉及到的汇编代码均以AT&T Syntax为准. 1. 基本语法规则 内联汇编(或称嵌入汇

汇编第五日

mov ax, offset 标号:取得标号相对于伪代码后第一条指令地址0的相对偏移量即标号地址 可以发现汇编指令中的idata会直接反映在机器码中 jmp指令可以修改IP或CS和IP的值,具体格式如下: ①jmp short 标号(段内转移) (IP) = (IP)+ 8位位移 8位位移含义是:标号地址减去jmp指令的下一条指令地址即为相对位移地址(可正可负,但是范围必须在8位数据能表示之内)并不是直接目的地址 8位位移范围为-128 - 127 例如: JMP 0008即跳到0BBD:000

在vs 2015环境下,c语言和汇编混编操作简析(更新中......)

在VS 2015环境下如何混编. 在新建工程里也会发现了很多问题, 应用程序类型分为:windows应用程序,控制台应用程序,DLL,静态库 静态库: 静态库是指在我们的应用中,有一些公共代码是需要反复使用,就把这些代码编译为"库"文件:在链接步骤中,连接器将从库文件取得所需的代码,复制到生成的可执行文件中的这种库. 程序编译一般需经预处理.编译.汇编和链接几个步骤.静态库特点是可执行文件中包含了库代码的一份完整拷贝:缺点就是被多次使用就会有多份冗余拷贝. 静态库和动态库是两种共享程序

用汇编来解释“计算机是怎么工作的”

本文章为<Linux内核分析>实验报告 梁永锐 原创作品转载请注明出处 http://www.cnblogs.com/liangyongrui/p/6392035.html <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 " ----- 以下为要分析的c代码 int g(int x) { return x + 36; } int f(int x) { return g(x) * 4; }

Java千百问_02基本使用(015)_java如何通过汇编方式运行

点击进入_更多_Java千百问-基本使用 1.java如何通过汇编方式运行 java本身不能通过汇编方式运行.但是,我们可以通过某些插件,在运行中将java代码解释为汇编指令,让我们能够通过分析执行的汇编指令来查找一些问题,也可以帮助我们分析和理解JVM是如何解释和编译的(当然java本身的编译和运行和汇编无关). PrintAssembly是JVM的一个运行参数,它允许我们获取在控制台打印java代码翻译成的汇编指令.使用PrintAssembly需要一些插件的支持,这些并不是JVM直接提供的

使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用

使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用 选择调用的进程为 24 i386 getuid sys_getuid1647 i386 getgid sys_getgid16 使用库函数API方式 使用C代码中嵌入汇编代码方式

汇编速查表

指令 功能 AAA 调整加 AAD 调整除 AAM 调整乘 AAS 调整减 ADC 进位加 ADD 加 AND 与 ARPL 调整优先级 BOUND 检查数组 BSF 位右扫描 BSR 位左扫描 BSWAP 交换字节 BT 位测试 BTC 位测试求反 BTR 位测试清零 BTS 位测试置一 CALL 过程调用 CBW 转换字节 CDQ 转换双字 CLC 进位清零 CLD 方向清零 CLI 中断清零 CLTS 任务清除 CMC 进位求反 CMOVA 高于传送 CMOVB 低于传送 CMOVE 相等

RT-11SJ 环境下运行pdp11汇编MACRO-11

一.在simh下运行RT-11SJ 1:安装simh:win下直接安装,linux下make后在BIN目录找到pdp11并cp到搜索路径目录下 2:到http://simh.trailing-edge.com/software.html 下载RT-11 V4 for the PDP-11 的镜像磁盘文件rt11swre.tar.Z并解压,在Disks目录下可得到镜像文件rtv4_rk.dsk 3:建立运行目录rt11swre,把rtv4_rk.dsk移到该目录 4:建立simh启动文件boot.