汇编语言程序设计读书笔记

                                                                                接第五章

条件传送指令

cmovx    source    destination

x是一个或者两个字母代码,表示将触发传送操作的条件,条件取决于EFLAGS寄存器当前的值

无符号传送指令和有符号传送指令

无符号传送指令依靠进位,零和奇偶校验标志来确定两个操作数之间的区别

带符号传送指令

带符号的条件mov指令使用符号和溢出标志表示操作数之间比较的状态

例子:

movl    value,    %ecx

cmp    %ebx,    %ecx

cmova    %ecx,    %ebx

把value标签的值传送到ecx寄存器 ,然后和ebx寄存器中的值比较并且cmp指令会适当的设置EFLAGS寄存器,如果ebx中的值小于ecx中的值,则把ecx中的值传送 到ebx中去

看一个例子程序:cmovtest.s

.section    .data

output:

    .ascii    "The largest number is %d\n"

values:

    .int    12 65 6 324 78 134 45 76 89 90

.section    .text

.globl    _start

    _start:

    nop

    movl    values,    %ebx

    movl    $1,    %edi

    loop:

    movl    values(, %edi, 4),    %eax

    cmp    %ebx,    %eax

    cmova    %eax,    %ebx

    inc    %edi

    cmp    $10,    %edi

    jne    loop

    pushl    ebx

    pushl    output

    call    printf

    addl    $8,    %esp

    pushl    $0

    call    exit

该程序查找values数组中最大的元素,现在只要关注条件传送语句如何工作就可以了。

由于调用了printf()函数,所以要连接动态库:

as -o *.o cmovtest.s

ld -dynamic-linker /lib/ld-linux.so.2 -lc -o  *.*(可执行文件名)  *.o(要链接的目标文件名)

程序 输出:

The largest number is 324

你可能感兴趣的:(汇编语言程序设计读书笔记)