32位彙編指令 條件傳送指令

2021-10-10 08:28:03 字數 1997 閱讀 1617

條件傳送指令如下:

cmoves,

d//等於

0時傳送

cmovzs,

d//同cmove

cmovnes,

d//不等於

0時傳送

cmovnzs,

d//同cmovne

cmovss,

d//負數時傳送

cmovnss,

d//非負數時傳送

cmovgs,

d//有符號大於時傳送

cmovnles,

d//同cmovg

cmovges,

d//有符號大於等於時傳送

cmovnls,

d//同cmovge

cmovls,

d//有符號小於時傳送

cmovnges,

d//同cmovl

cmovles,

d//有符號小於等於時傳送

cmovngs,

d//同cmovle

cmovas,

d//無符號大於時傳送

cmovnbes,

d//同cmova

cmovaes,

d//無符號大於等於時傳送

cmovnbs,

d//同cmovae

cmovbs,

d//無符號小於時傳送

cmovnaes,

d//同cmovb

cmovbes,

d//無符號小於等於時傳送

cmovnas,

d//同cmovbe

示例:

int

absdiff

(int x,

int y)

gcc -o1 -s -m32 -march=i686 test_absdiff.c

absdiff:

pushl   %ebp

movl %esp, %ebp

pushl %ebx

movl 8(%ebp), %ecx //ecx = x

movl 12(%ebp), %edx //edx = y

movl %edx, %ebx //ebx = y

subl %ecx, %ebx //ebx = y - x

movl %ecx, %eax //eax = x

subl %edx, %eax // eax = x -y

cmpl %edx, %ecx //比較x和y

cmovl %ebx, %eax //如果x小於y,eax = ebx = y -x

popl %ebx

popl %ebp

ret

如果不新增-march=i686,生成彙編**如下:

absdiff:

pushl   %ebp

movl %esp, %ebp

movl 8(%ebp), %edx //edx = x

movl 12(%ebp), %eax //eax = y

cmpl %eax, %edx //比較x和y

jge .l2 //如果x大於等於y,跳轉到l2

subl %edx, %eax //eax = y - x

jmp .l4 //跳轉到l4

.l2:

subl    %eax, %edx //edx = x - y

movl %edx, %eax //eax = edx = x- y

.l4:

popl    %ebp

ret

兩份彙編**的區別是,乙個使用了條件傳送,另外乙個使用了跳轉指令。跳轉指令需要處理器做分支**,但是條件傳送指令不需要,因此,使用條件傳送指令的彙編**效率要高一點。

32位彙編 XLAT指令

xlat作用 將 bx al 送給 al 簡單 將bx為首 位址的,偏移位址為al的內容送給al。直接看例子 data x dw 1122h,3344h,5566h,7788h code lea bx,x 獲取x的首位址 mov al,03h 將03h作為偏移位址 xlat 結果al為33h。在執行...

彙編批量傳送指令

檢視linux核心 時,常常看到下面八個彙編指令,下面簡單講解一下它們的含義和用法。這8個是彙編常用的批量傳送指令,用來載入或者儲存幾個連續的記憶體。ldmib ldmia ldmdb ldmda stmib stmia stmdb stmda 觀察指令時可將指令分兩部分解釋 ldm load me...

8086彙編 資料傳送指令

於ibm pc組合語言程式設計 沈美明 溫冬嬋 編著 負責把 資料,位址或立即數傳送到暫存器或者儲存單元中.1.通用資料傳送指令 mov,push,pop,xchg mov指令在cpu內或cpu和儲存器之間傳送位元組或字,目的運算元不允許使用立即數,也不能用cs暫存器,不允許用mov指令在兩個儲存單...