1. 程式人生 > >匯編語言入門:流程控制

匯編語言入門:流程控制

存儲 clas lan 實現 不一定 oba 替代 log sub

流程控制:順序,分支,循環

程序計數器PC中存儲當前執行的程序在EM中的位置

匯編裏面,用比較、跳轉實現流程控制.

1.順序:PC+1(不一定加一,看指令長度)

2.分支循環,直接賦給PC值,執行指定地址的程序

有時候需要程序有一定的流程控制能力,它不是老老實實按照順序來執行的,中間可能會跳過一些代碼

修改PC值,不可用MOV指令,PC是特殊的寄存器,特殊對待,跳轉指令修改其值。

跳轉指令:

 1 ja 大於時跳轉
 2 jae 大於等於
 3 jb 小於
 4 jbe 小於等於
 5 je 相等
 6 jna 不大於
 7 jnae 不大於或者等於
 8 jnb 不小於
 9 jnbe 不小於或等於
10 jne 不等於 11 jg 大於(有符號) 12 jge 大於等於(有符號) 13 jl 小於(有符號) 14 jle 小於等於(有符號) 15 jng 不大於(有符號) 16 jnge 不大於等於(有符號) 17 jnl 不小於 18 jnle 不小於等於 19 jns 無符號 20 jnz 非零 21 js 如果帶符號 22 jz 如果為零

1 a: above
2 e: equal
3 b: below
4 n: not
5 g: greater
6 l: lower
7 s: signed
8 z: zero

C語言的if語句:

int main() {
    int
a = 50; if( a > 10 ) { a = a - 10; } return a; }

其匯編程序:

global main

main:
    mov eax, 50
    cmp eax, 10                         ; 對eax和10進行比較
    jle xiaoyu_dengyu_shi            ; 小於或等於的時候跳轉
    sub eax, 10
xiaoyu_dengyu_shi:
    ret
  • 第一條,cmp指令,專門用來對兩個數進行比較
  • 第二條,條件跳轉指令,當前面的比較結果為“小於或等於
    ”的時候就跳轉,否則不跳轉

即:比較eax和10,eax小於等於10的時候,跳過中間的減法

  • C語言中:a大於10的時候,進入if塊中執行減法
  • 匯編語言中:eax小於等於10的時候,跳過中間的減法

同樣,比較a<10 a<=10 a==10 a>=10同理

C語言的while循環:

int sum = 0;
int i = 1;
while( i <= 10 ) {
    sum = sum + i;
    i = i + 1;
}

C語言中不使用循環怎麽實現循環的功能:用跳轉!

int sum = 10;
int i = 1;

_start:
if( i <= 10 ) {
    sum = sum + i;
    i = i + 1;
    goto _start;
}

變形:

1 if( a <= 10 ) goto out_of_block;
2 
3 // some code
4 
5 out_of_block:

if塊裏只需要放一條跳轉語句即可

if裏的條件是反過來的

跳轉語句的功能是跳過“正宗C代碼”的if塊

int sum = 10;
int i = 1;

_start:
if( i > 10 ) {
    goto _end_of_block;
}

sum = sum + i;
i = i + 1;
goto _start;

_end_of_block:

為什麽要變形?我們需要if塊中都僅有一條goto語句!

逐行翻譯為匯編:

global main

main:
    mov eax, 0
    mov ebx, 1
_start:
    cmp ebx, 10
    jg _end_of_block
    
    add eax, ebx
    add ebx, 1
    jmp _start
    
_end_of_block:
    ret

單條goto語句可以直接用jmp語句替代

if和goto組合的語句塊可以用cmp和j*指令的組合替代

綜上:

  匯編實現while

  • 將while循環拆解成只有if和goto的形式
  • 將if形式的語句拆解成if塊中僅有一行goto語句的形式
  • 從前往後逐行翻譯成匯編語言

do-while循環、for循環可轉為while循環

感謝:https://zhuanlan.zhihu.com/p/23902265

匯編語言入門:流程控制