組合語言跳轉翻譯為c語言if else語句

2021-08-07 16:53:02 字數 1285 閱讀 6138

將條件表示式和語句從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 的值跳轉 基於無符號運算元的比較跳轉 基於有符號運算元的比較跳轉 下表展示了基於零標誌位 進製標...