美文网首页
汇编学习笔记(四)

汇编学习笔记(四)

作者: Jesse_996 | 来源:发表于2019-12-27 04:54 被阅读0次

call和ret指令

call和ret都是转移指令,都修改IP,或同时修改CS和IP。

ret和retf

  • ret 指令用栈中数据,修改IP的内容,从而实现近转移
  • retf 指令用栈中数据,修改CS和IP的内容,从而实现远转移

执行ret指令时,cpu执行以下2部操作:

  1. ip=ss*10H+sp
  2. sp=sp+2

相当于pop ip

执行retf指令时,进行下面4部操作:

  1. ip=ss*10H+sp
  2. sp=sp+2
  3. cs=ss*10H+sp
  4. sp=sp+2

相当于pop ip ;pop cs

call指令

执行call指令时,进行2部操作:

  1. 将当前ip或cs和ip压栈
  2. 转移

call不能实现短转移,除此之外,call实现转移的方法和jmp相同:

  • call 标号:将当前ip压栈后,转到标号处执行,相当于:
push ip
jmp near ptr 标号
  • call far ptr 标号:实现段间转移,相当于:
push cs
push ip
jmp far ptr 标号
  • call 16位寄存器:相当于:
push ip
jmp 16位寄存器
  • call word ptr 内存单元地址,相当于:
push ip
jmp word ptr 内存单元地址
  • call dword ptr 内存单元地址,相当于:
push cs
push ip
jmp dword ptr 内存单元地址

mul指令

mul是乘法指令,要注意以下两点:

  1. 两个相乘的数:要么都是8位,要么都是16位。如果是8位,一个放在al,一个放在8位寄存器或内存字节单元中;若是16位,一个在ax,一个在16位寄存器中。
  2. 结果:如果是8位乘法,结果默认放在ax中;如果是16位,结果高位放在dx,低位放在ax。

解决除法溢出的方法:

X/N = int( H/N)65536 + [rem( H/N )65536 + L ] / N
X:被除数,N:除数,H:高16位,L:低16位,int:取商,rem:取余数

标志寄存器

ZF标志(zero flag)

flag第6位是ZF,零标志位。它记录执行相关指令后,其结果是否为0。为0则zf=1,否则zf=0。
注意:8086中,有些指令是影响flag的,比如:add、sub、mul、div、inc、or、and等,它们大多是运算指令(逻辑或算数运算);有一些则对flag没影响,如:mov,push,pop等,大多是传送指令。

PF标志(Parity flag)

flag第2位是PF,奇偶标志位。看执行结果的所有bit位中1的个数是否是偶数。是偶数则pf=1,否则pf=0。
可以理解成1偶标志位。

SF标志位(Sign Flag)

flag第7位是SF,符号标志位。记录相关指令执行后结果是否为负。如果为负,sf=1;否则sf=0
注意:sg是cpu默认将数据当成有符号运算结果的记录。如果我们将数据当做无符号时,sf时没有意义的,虽然相关指令可能影响了它的值。是不是有符号运算取决于我们。

CF标志位(Carry Flag)

flag第0位是CF标志位。一般情况下,在进行无符号数运算时,它记录了运算结果的最高有效位向更高位的进位值,或借位值。
inc和loop指令不影响cf

OF标志位(Overflow Flag)

flag第11位是OF,溢出标志位。记录了有符号运算的结果是否溢出。有溢出of=1,否则of=0;

注意和CF的区别:
cf是对符号数运算有意义的标志位
of是对符号数运算有意义的标志位

adc指令

adc是带进位加法指令,它利用了CF位上记录的进位值。(add +carry --> adc)如:
adc ax,bx实现的功能是ax=ax+bx+cf
cpu提供adc的目的,就是来进行加法的第二步运算的。

sbb指令

sbb是带借位减法指令(sub borrow),利用cf记录的借位值。
sbb ax,bx实现的功能是ax=ax-bx-cf
cpu提供dbb的目的,就是来进行减法的第二步运算的。

cmp指令

cmp是比较指令,相当于减法指令,只是不保留结果。cmp会对flag产生影响。如:
cmp ax,axax-ax运算,但并不在ax中保存,仅影响flag。
进行·cmp ax,bx·比较后,通过flag可以看出比较结果

  • zf=1:ax=bx
  • cf=1:ax<bx
  • cf=0:ax>=bx
  • cf=0且zf=0:ax>bx
  • cf=1或zf=1:ax<=bx

注意:单纯的看sf的值不能判断结果的正负,因为可能会发生溢出。
而通过sf和of的值可以判断。

  1. sf=1,of=0:没发生溢出,实际结果负,则逻辑结果也为负
  2. sf=0,of=0:同上,逻辑结果非负
  3. sf=1,of=1:有溢出,则实际与逻辑相反,逻辑为正。
  4. sf=0,of=1:实际结果非负,又of=1,则结果非0,所以实际为正,逻辑结果为负。

条件转移指令

通常配合cmp,由cmp先进行比较,改变了flag中的值,条件转移指令根据flag中的值执行。
下面根据无符号数的比较进行转移的有:

指令 含义 条件
je 等于则转移 由 zf=1 则转移
jne 不等于则转移 zf=0
jb 低于则转移 cf=1
jnb 不低于则转移 cf=0
ja 高于则转移 cf=0 且 zf=0
jna 不高于则转移 cf=1 或 zf=1

DF标志和串传送指令

flag第10位是DF,方向寄存器。在串处理指令中,控制每次操作后si、di的增减

  • df=0:每次操作后si、di递增
  • df=1:每次操作后si、di递减

movsb指令

格式:movsb
相当于:

mov es:[di],byte ptr ds:[si];(8086不支持这样的命令,这里只是描述)
if df = 0:
  inc si
  inc di
elif df = 1:
  dec si
  dec di

movsw

类似上面,就是si,di 每次加或减2

movsbmovsw进行的是串传送的一个步骤,通常配合rep使用,如:
rep movsb,相当于:

s:movsb
  loop s

可见rep是根据cx的值,重复执行后面的串传送指令。

  • cld指令:可以将df置0
  • std指令:可以将df置1

pushf和poopf

pushf功能是将标志寄存器的值压栈,popf是从栈中弹出数据给标志寄存器中。
通过pushf和popf,可以直接访问flag

相关文章

  • ARM64汇编学习笔记一(初始汇编)

    ARM64汇编学习笔记一(初始汇编)

  • 汇编学习笔记(四)

    call和ret指令 call和ret都是转移指令,都修改IP,或同时修改CS和IP。 ret和retf ret ...

  • 汇编语言 学习笔记(三)

    汇编语言学习笔记 四、汇编语言程序格式 语句基本格式 汇编语言程序中的语句由 4 项组成,格式如下: 名字(nam...

  • 汇编语言之基础

    本系列为学习<汇编语言> 王爽版 的学习笔记 [TOC] 汇编语言是什么? 汇编语言是直接在硬件之上工作的编程语言...

  • 汇编学习笔记

    工具:DTDebug(VT-O)专业版V1.0.025主要有四个窗口:反汇编窗口、寄存器窗口、堆栈窗口、内存窗口。...

  • 汇编学习笔记

    抄的博客 通用寄存器: AX,BX,CX,DX 称作为数据寄存器: AX (Accumulator):累加寄存器,...

  • 汇编学习笔记

    地址 指令执行过程 cpu从cs:ip所组成的地址中读取指令,将指令放到指令缓存器中 IP = IP + 所读指令...

  • 汇编学习笔记

    汇编学习笔记 花了一周的时间,对汇编做了一次深刻的复习和再学习,想记下来的东西有很多,我尽量把总结写全。 0x01...

  • 汇编入门(长文多图,流量慎入!!!)

    8086汇编 本笔记是笔者观看小甲鱼老师(鱼C论坛)《零基础入门学习汇编语言》系列视频的笔记,在此感谢他和像他一样...

  • <安全攻防之汇编基础>

    &关于汇编基础请点击 <汇编一> <汇编二> <汇编三> <汇编四> <汇编五> <汇编六> <汇编七> <汇编八...

网友评论

      本文标题:汇编学习笔记(四)

      本文链接:https://www.haomeiwen.com/subject/jbjroctx.html