跳至内容
汇编语言

汇编语言

第10章 CALL和RET指令

10.1 ret和retf

10.2 call指令

10.3 依据位移进行转移的call指令

10.4 转移的目的地址在指令中的call指令

10.5 转移地址在寄存器中的call指令

10.6 转移地址在内存中的call指令

10.7 call和ret的配合使用

10.8 mul指令

10.9 模块化程序设计

10.10 参数和结果传递的问题

10.11 批量数据的传递

10.12 寄存器冲突的问题

第11章 标志寄存器

标志寄存器(flag)的作用:

  1. 用来存储相关指令的某些执行结果;
  2. 用来为CPU执行相关指令提供行为依据;
  3. 用来控制CPU的相关工作。

image-20230211214531253

11.1 ZF标志

flag的第6位 ZF 是 零标志位

结果为0,zf=1; 1表示逻辑真,即代表肯定“是0”这样的信息

结果不为0,zf=0。 0表示逻辑假,即否定含义,表示“结果不是0”

大多数运算指令对标志寄存器有影响,大多数传送指令大多数对标志寄存器没有影响。

11.2 PF标志

flag的第3位 PF 是 奇偶标志位

结果所有bit位中1的个数为偶数,pf=1;

结果所有bit位中1的个数为奇数,pf=0;

11.3 SF标志

flag的第3位 SF 是 符号标志位

结果为负,sf=1;

结果为非负,sf=0;

11.4 CF标志

flag的第0位 CF 是 进位标志位

在进行==无符号位==运算的时候,它记录了运算结果的最高有效位向更高位的进位值,或从更高位的借位值。

image-20230212094913035

当更高位需要进位或者借位时,cf=1;

当更高位不需ddai要进位或者借位时,cf=0;

11.5 OF标志

flag的第0位 OF 是 溢出标志位

==有符号数运算==结果发生了溢出,OF=1;

==有符号数运算==结果没有发生溢出,OF=0;

11.6 adc指令

带进位加法指令

指令格式:adc 操作对象1,操作对象2

功能:操作对象1 = 操作对象1 + 操作对象2 + CF

例子: adc ax,bx 实现的功能是:(ax)=(ax)+(bx)+CF

11.7 sbb指令

带错位减法指令

指令格式:sbb 操作对象1,操作对象2

功能:操作对象1 = 操作对象1 - 操作对象2 - CF

例子: sbb ax,bx 实现的功能是:(ax)=(ax)-(bx)-CF

11.8 cmp指令

比较指令

指令格式:cmp 操作对象1,操作对象2

功能:计算 操作对象1 - 操作对象2 但不保存结果,仅仅根据计算结果对标志寄存器进行设置

例子: cmp ax,ax ,做(ax)-(ax)的运算,结果为0,但并不在ax中保存,仅影响flag的相关各位。指令执行后:zf=1,pf=1,sf=0,cf=0,of=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。

指令 cmp ax,bx 的逻辑含义是比较ax和bx中的值,如果执行后:

zf=1,说明(ax)=(bx)

zf=0,说明(ax)≠(bx)

cf=1,说明(ax)<(bx)

cf=0,说明(ax)≥(bx)

cf=0并且zf=0,说明(ax)>(bx)

cf=1或zf=1,说明(ax)≤(bx)

== 以上是cmp指令对无符号数进行比较,以下是有符号数 ==

cmp ah,bh

如果(ah)=(bh)则(ah)-(bh)=0,所以:zf=1;

如果(ah)≠(bh)则(ah)-(bh)≠0,所以:zf=0;

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

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

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

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