movx source, destination
movl $0, %eax # 0 送往 EAX 寄存器
movl $0x80, %ebx # 16 进制 80 送往 EBX 寄存器
movl $100, height # 100 送往 height 所标识的内存位置处
movl %eax, %ecx
movw %ax, %cx
movb %al, %bx
movl value, %eax
molv %ecx, value
values:
.int 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60
base_address (offset_address, index, size)
base_address + offset_address + index * size
movl $2, %edi
movl values(, %edi, 4), %eax
.section .data
output:
.asciz "The value is %d\n"
values:
.int 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60
.section .text
.globl _start
_start:
nop
movl $0, %edi
loop:
movl values(, %edi, 4), %eax
pushl %eax
pushl $output
call printf
addl $8, %esp
inc %edi
cmpl $11, %edi
jne loop
movl $0, %ebx
movl $1, %eax
int $0x80
$ ./movetest3
The value is 10
The value is 15
The value is 20
The value is 25
The value is 30
The value is 35
The value is 40
The value is 45
The value is 50
The value is 55
The value is 60
movl values(%edi), %eax
pushl %eax
pushl $output
call printf
addl $8, %esp
addl $4, %edi
cmpl $44, %edi
jne loop
movl $values, %edi
movl %ebx, (%edi)
movl %ebx, 4(%edi)
movl %ebx, -4(%edi)
cmovx source, destination
EFLAGS位 | 名称 | 描述 |
CF | 溢出(Carry)位 | 数学表达式产生了进位或者借位 |
OF | 溢出(Overflow)位 | 整数值过大或过小 |
PF | 奇偶校验(Parity)位 | 寄存器包含数学操作造成的错误数据 |
SF | 符号(Sign)位 | 指出结果为正还是负 |
ZF | 零(Zero)位 | 数学操作的结果为零 |
指令对 | 描述 | EFLAGS状态 |
CMOVA/CMOVNBE | 大于/不小于或者等于 | (CF或ZF)=0 |
CMOVAE/CMOVNB | 大于或者等于/不小于 | CF=0 |
CMOVNC | 无进位 | CF=0 |
CMOVC | 进位 | CF=1 |
CMOVB/CMOVNAE | 小于/不大于或者等于 | CF=1 |
CMOVBE/CMOVNA | 小于或者等于/不大于 | (CF或ZF)=1 |
CMOVE/CMOVZ | 等于/零 | ZF=1 |
CMOVNE/COMVNZ | 不等于/不为零 | ZF=0 |
CMOVP/CMOVPE | 奇偶校验/偶校验 | PF=1 |
CMOVNP/CMOVPO | 非奇偶校验/奇校验 | PF=0 |
指令对 | 描述 | EFLAGS状态 |
CMOVGE/CMOVNL | 大于或者等于/不小于 | (SF异或OF)=0 |
CMOVL/CMOVNGE | 小于/不大于或者等于 | (SF异或OF)=1 |
CMOVLE/CMOVNG | 小于或者等于/不大于 | ((SF异或OF) 或 ZF)=1 |
CMOVO | 溢出 | OF=1 |
CMOVNO | 未溢出 | OF=0 |
CMOVS | 带符号(负) | SF=1 |
CMOVNS | 无符号(非负) | SF=0 |
movl value, %ecx
cmp %ebx, %ecx
cmova %ecx, %ebx
.section .data
output:
.asciz "The largest value is %d\\n"
values:
.int 105, 235, 61, 315, 134, 221, 53, 145, 117, 5
.section .text
.global _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
$ as -gstabs -o cmovtest.o cmovtest.s
$ ld -dynamic-linker /lib/ld-linux.so.2 -o cmovtest -lc cmovtest.o
$ ./cmovtest
The largest value is 315
欢迎光临 曲径通幽论坛 (http://www.groad.net/bbs/) | Powered by Discuz! X3.2 |