條件傳送指令如下:
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指令在兩個儲存單...