assembly4

news/2024/11/29 22:42:16/文章来源:https://www.cnblogs.com/misaki-mei2024/p/18577744

assembly 4

call & ret

ret与retf

ret用栈中数据修改IP内容实现近转移

retf修改CS和IP实现远转移

ret指令操作:

  • (IP)=((ss)*16+(sp))
  • (sp)+=2

retf指令操作:

  • (IP)=((ss)*16+(sp))
  • (sp)+=2
  • (CS)=((ss)*16+(sp))
  • (sp)+=2

由是观之,ret等于执行

pop IP

retf等于执行

pop IP
pop CS

call

格式:call 标号

操作:

  • 将当前IP或CS以及IP压入栈
  • 转移至标号

call不能短转移,跟jmp一样可以用三种方法获取偏移。

简单来讲call和ret就是高级语言中的调用函数和return。

mul

乘法,与div相似。两数要么都是8位,默认第一个乘数在al寄存器,结果在ax寄存器;要么都是16位,默认第一个乘数在ax。结果高位在dx,低位在ax。

如:

mov al,100
mov bl,10
mul bl         ;结果:(ax)=1000

标志寄存器

功能:

  • 用来存储相关指令的某些执行结果;

  • 用来为 CPU 执行相关指令提供行为依据;

  • 用来控制CPU的相关工作方式。

8086中,flag寄存器,16位,分为有效标志位和无效位。

ZF标志位

零校验,检测相关指令执行后结果是否是0,是0则zf=1,不是则zf=0。

例如:

mov ax,1
sub ax,1
;结果是0,此时zf=1
mov ax,1
or ax,0
;结果是1,此时zf=0

在8086中,add,sub,mul,div,and,or这类运算指令会改变标志位,而mov,push,pop这类传送指令不会。

PF标志位

奇偶校验,判断结果bit位中1的个数是否为偶数,是则pf=1,不是则pf=0。

SF标志位

符号校验,判断结果是否为负,实则sf=1,不是则sf=0。

对于同一个二进制数据而言,我们既可以把他当作有符号数,也可以当作无符号数,计算机存储了作为有符号数和无符号数两种情况,sf是在有符号数运算的情况下表示结果的符号。如:

mov al,10000001B
add al,1

执行后, 结果为 10000010B, sf=1, 表示: 如果指令进行的是有符号数运算, 那么结果为负(就是看最高位是不是1)。

CF标志位

记录了进位/借位,比如:

mov al,98H ;1001 1000B
add al,al  ;0011 0000B
;超出8位范围,al仅保留8位,进位cf=1
add al,al  ;0110 0000B
;未超出8位范围,没有进位,cf=0
mov al,97H 
sub al,98H   ;cf=1
sub al,al    ;cf=0

OF标志位

溢出校验,是否超出对于该数据而言,机器所能表示的范围。

带进位运算adc和sbb

带进位加法,例如adc ax,bx实现的是(ax)=(ax)+(bx)+cf

带进位减法,例如sbb ax,bx实现的是(ax)=(ax)-(bx)-cf

cmp指令

操作

比较但是不存储结果,仅根据结果进行标志寄存器的设置。

比如:

mov ax,8
mov bx,3
cmp ax,bx

其中(ax)-(bx)答案是5,据此设置zf=0(不是0),pf=1(二进制为101,bit位1的个数是偶数),cf=0(没有进位)。

cmp ax,bx比较结果对寄存器标志位的影响:

如果( ax)=( bx) 则( ax)-( bx)=0, 所以: zf=1;

如果( ax)≠( bx) 则( ax)-( bx)≠0, 所以: zf=0;

如果( ax)<( bx) 则( ax)-( bx)将产生借位, 所以: cf=1;

如果( ax)≥( bx) 则( ax)-( bx)不必借位, 所以: cf=0;

如果( ax)>( bx) 则( ax)-( bx)既不必借位, 结果又不为0, 所以: cf=0并且 zf=0;

如果( ax)≤( bx) 则( ax)-( bx)既可能借位, 结果可能为0, 所以: cf=1或 zf=1。

由此可以形成对ax,bx大小关系的比较。

各种基于flag寄存器的条件跳转指令

je ;equal
jne ;not equal
jb ;below
jnb ;not below
ja ;above
jna ;not above

以上基于cmp ax,bx后flag寄存器的符号位来比较,决定是否跳转。

IDA Pro中经常见到jz,jnz,查询后发现跟je,jne是等价的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/843717.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【探讨】批量操作以及多线程下保证事务的一致性

1 前言 假如给你一个场景,有一批1万或者10万的数据,让你插入到数据库中怎么做呢?我们这节来看看。 首先一点我们单纯的 一个个 INSERT 语句,我们就不试了,这一个个的肯定慢,我们这里统一用 INSERT INTO 表(字段1,字段2) VALUES(值1,值2),(值11,值22),(值111,值222);…

Windows mstsc 远程桌面链接 ubuntu 18.04 远程图形桌面

前言全局说明通常情况下,管理 Ubuntu 服务器都是用命令行界面,但某些时候,可能会用到图形界面。2204安装方法:https://www.cnblogs.com/wutou/p/18430133 命令行安装图形界面:https://www.cnblogs.com/wutou/p/18572907一、说明 环境: Ubuntu 18.04.6 LTS (Linux qt-vm 5…

[杂题]2024.9~2024.11 杂题总结

[杂题]2024.9~2024.11 杂题总结 题目做多了,不总结,和没做是一样的。 ARC061B 挺好的一道题。观察到三个不好做,我们想能否搞成一个牌堆去取。发现显然是可以的,我们只需要知道一个确定的取出来牌的编号序列,必然可以确定三者的牌堆分别是什么。 所以,问题转换成了:有多…

E. Photoshoot for Gorillas(Codeforces Round 966 (Div. 3))

https://codeforces.com/contest/2000/problem/E 题目描述 你非常喜欢屮大猩猩,于是你决定为它们组织一次拍摄活动。大猩猩生活在丛林中,丛林被表示为一个有 n 行 m 列的网格,有 w 个大猩猩同意参与拍摄,第 i 个大猩猩的身高ai .你希望将所有大猩猩放置在网格的单元格中,并…

windows版lammps的安装和计算

1.安装:详情见:https://mp.weixin.qq.com/s/xwx0c2ATNM0pphaHwDLkmQ 2.提交计算task的命令: mpiexec -np 4 lmp -in xxx.in #其中xxx.in表示in文件的名称,详情见 https://mp.weixin.qq.com/s/i6fa7xTKjlgSirPm0cj_4w 3.将MS的car和mdf文件导出data文件的方法:(命令…

第三十八讲:自增主键为什么不是连续的

你现在可以不懂,但以后面试的时候,必须要知道的三个关于自增主键的点 第一:唯一键冲突和事务回滚是导致自增主键不连续的两种大原因,此外批量插入数据的语句,MySQL 批量申请自增 id 的策略也是一个隐藏原因 第二:MySQL设计中不允许自增值回退的原因,主要是为了提升性能还…

NOIP 2024 退役记

人生有梦,各自精彩。Day -??? 摆疯了,啥也没复习,猫国建设者真好玩。 Day 0 昨晚回家结果摆到两点,感觉要在 noip 考场上睡着了/shui。早上没起来,迟到了/kk。 上午没怎么复习,摆摆摆,哎哎哎。 中午疯狂看小说,败犬太好看辣! 下午出发淄博。路上一直在睡觉,后悔没…

MySQL底层概述—4.InnoDB数据文件

大纲 1.表空间文件结构 (1)表空间Tablesapce (2)段Segment (3)区Extend (4)页Page (5)行Row 2.Page结构 (1)页结构各部分说明 (2)页结构整体划分 3.行记录格式 (1)行格式分类 (2)COMPACT行记录格式 (3)Compact中的行溢出机制 (4)其他行格式记录1.表空间文件结构 (1)表空间Table…

gin

Gin Gin入门 gin的学习要点如何定义路由:包括参数路由、通配符路由 如何处理输入输出 如何使用middleware解决AOP问题在 Gin 里面,用 Engine 来监听一个端口,是一个逻辑上的服务器。 一个 Go 进程可以创建多个 Engine。 hello, world 使用步骤:在应用中引入 Gin 依赖:go g…

MySQL底层概述—3.InnoDB线程模型

大纲 1.InnoDB的线程模型 2.IO Thread 3.Purge Thread 4.Page Cleaner Thread 5.Master Thread1.InnoDB的线程模型 InnoDB存储引擎是多线程的模型,因此其后台有多个不同的后台线程,负责处理不同的任务。后台线程的作用一:负责刷新内存池中的数据,保证缓冲池中的内存缓存是最…

20222427 2024-2025-1 《网络与系统攻防技术》实验七实验报告

1.实验内容 1.1 本周学习内容本周学习了有关Web安全的相关知识,复习了一些有关于Web的基础知识,比如:前、后端的定义,以及在前后端各自使用的语言,如:html、css、JS(前端);C/C++、Python、Java、Go、Php(后端)等。学习了有关于数据库攻击的一些基本操作,如:SQL注入…

基于Java+SpringBoot+Mysql实现的点卡各种卡寄售平台功能设计与实现四

部分功能:实名认证信息数据层Dao、银行卡类型信息数据层Dao、卡种类信息数据层Dao、卡类型信息数据层Dao、卡面值信息数据层Dao一、前言介绍: 免费学习:猿来入此 1.1 项目摘要 随着电子商务和在线支付技术的快速发展,数字商品和虚拟货币的交易需求日益增长。点卡及各种卡类…