將條件表示式和語句從c語言翻譯成機器**,最常用的方式是結合有條件和無條件跳轉(這裡只討論有條件跳轉)
對於大多數情況 彙編**就是c語言的直接翻譯
而c語言中的goto語句類似於彙編中的無條件跳轉所以先看一下 if else 由goto語句完成
int absdiff(int x, int y)//返回兩數差的絕對值
可以看到if else語句轉為goto語句的直接翻譯方式
t = test - expr;
if(!t)//c語言中真為非零 假為零
goto false;
then - statement
goto done;
false;
else - statement
done:
彙編中跳轉轉化為c語句此處使用att**格式(取自深入理解計算機系統)
x位於%ebp+8 y位於%ebp+12
movl 8(%ebp), %eax
movl 12(%ebp), %edx
cmpl $-3, %eax//x - (-3)操作同sub指令相同但是無目的運算元
jge .l2//如果x 大於等於-3則跳轉至標記 l2
cmpl %edx, %eax//比較x y
jle .l3//如果x小於等於y則跳轉至l3
imull %edx, %eax//如果x大於y則執行此處並跳轉至l4
jmp .l4//直接跳轉不需要條件
.l3:
leal (%eax, %edx), %eax//此處x小於等於y則 x+y將結果儲存到val中
jmp .l4
.l2://x大於等於-3
cmpl $2, %eax
jg .l5//如果x大於2執行此處
xorl %edx, %eax//當前面所有條件都不滿足時執行 也就是最開始的賦值
jmp .l4
.l5://由前面執行時是個跳轉 到達標記l5
subl %edx, %eax
.l4:
c**
int test(int x, int y)
else if(x > 2)//x>2滿足條件則執行此處跳轉
val = x -y;
return val;//返回val值
}
組合語言跳轉總結
跳轉指令分三類 一 無條件跳 jmp 無條件跳轉 二 根據cx ecx暫存器的值跳 jcxz cx 為 0 則跳轉 jecxz ecx 為 0 則跳轉 三 根據eflags暫存器的psw標誌位跳轉,這個太多了.根據標誌位跳轉的指令 je 等於則跳轉 同jz jne 不等於則跳轉 同jnz ja 無符...
組合語言 AT T組合語言
這兩天的pwn題環境都是在linux中,採用的組合語言是 at t 格式。之前學習的是intel格式的8086彙編,今天學習了下at t組合語言。基於x86 架構的處理器所使用的彙編指令一般有兩種格式 操作intel格式at t格式 暫存器命名 push eax pushl eax 常數 立即運算元...
組合語言條件跳轉指令彙總
x86 指令集包含大量的條件跳轉指令。它們能比較有符號和無符號整數,並根據單個 cpu 標誌位的值來執行操作。條件跳轉指令可以分為四個型別 基於特定標誌位的值跳轉 基於兩數是否相等,或是否等於 e cx 的值跳轉 基於無符號運算元的比較跳轉 基於有符號運算元的比較跳轉 下表展示了基於零標誌位 進製標...