流程控制:順序,分支,迴圈
程式計數器pc中儲存當前執行的程式在em中的位置
彙編裡面,用比較、跳轉實現流程控制.
1.順序:pc+1(不一定加一,看指令長度)
2.分支迴圈,直接賦給pc值,執行指定位址的程式
有時候需要程式有一定的流程控制能力,它不是老老實實按照順序來執行的,中間可能會跳過一些**
修改pc值,不可用mov指令,pc是特殊的暫存器,特殊對待,跳轉指令修改其值。
跳轉指令:
1ja 大於時跳轉
2jae 大於等於
3jb 小於
4jbe 小於等於
5je 相等
6jna 不大於
7jnae 不大於或者等於
8jnb 不小於
9jnbe 不小於或等於
10jne 不等於
11jg 大於(有符號)
12jge 大於等於(有符號)
13jl 小於(有符號)
14jle 小於等於(有符號)
15jng 不大於(有符號)
16jnge 不大於等於(有符號)
17jnl 不小於
18jnle 不小於等於
19jns 無符號
20jnz 非零
21js 如果帶符號
22 jz 如果為零
1a: above
2e: equal
3b: below
4n: not
5g: greater
6l: lower
7s: signed
8 z: zero
c語言的if語句:
intmain()
return
a;}
其匯程式設計序:
globalmain
main:
mov eax,
50cmp eax,
10; 對eax和10進行比較
jle xiaoyu_dengyu_shi ; 小於或等於的時候跳轉
sub eax,
10xiaoyu_dengyu_shi:
ret
即:比較eax和10,eax小於等於10的時候,跳過中間的減法
同樣,比較a<10 a<=10 a==10 a>=10同理
c語言的while迴圈:
int sum = 0;int i = 1
;while( i <= 10
)
c語言中不使用迴圈怎麼實現迴圈的功能:用跳轉!
int sum = 10;int i = 1
;_start:
if( i <= 10
)
變形:
1if( a <= 10 ) goto
out_of_block;23
//some code
45 out_of_block:
if塊裡只需要放一條跳轉語句即可
if裡的條件是反過來的
跳轉語句的功能是跳過「正宗c**」的if塊
int sum = 10;int i = 1
;_start:
if( i > 10
) sum = sum +i;
i = i + 1
;goto
_start;
_end_of_block:
為什麼要變形?我們需要if塊中都僅有一條goto語句!
逐行翻譯為彙編:
globalmain
main:
mov eax,
0mov ebx,
1_start:
cmp ebx,
10jg _end_of_block
add eax, ebx
add ebx,
1jmp _start
_end_of_block:
ret
單條goto語句可以直接用jmp語句替代
if和goto組合的語句塊可以用cmp和j*指令的組合替代
綜上:彙編實現while
do-while迴圈、for迴圈可轉為while迴圈
感謝:
組合語言入門六 流程控制(二)
前面說到在組合語言中實現類似c語言if else if else這樣的結構,實際上,在彙編裡面,我們並不關心if了,取而代之的是兩種基本的指令 這兩種指令即可組成最基本的分支程式結構,雖然跳轉指令非常多,但是我們已經有套路了,怎麼跳轉都不怕了。當然,在程式設計環境中僅有分支還不夠的,我們知道c語言中...
組合語言入門
1.資料傳送類指令 2.算術運算類指令 3.邏輯運算與移位類指令 4.串類指令 5.資料轉移控制類指令 6.處理器控制類指令 注意 本文章中涉及到的暫存器是以 intel 8086作為標準 格式 mov 目的運算元,源運算元 例如 mov ax,bx mov ax,2000h 注意,這一句指令是正確...
關於組合語言入門
組合語言我終於入門了,不管怎樣,我覺得只要是自己能繼續自己學習下去就算把一門語言入門了。昨天微型計算機上機實驗的時候題目很有難度,我乙個也沒有做出來,很受打擊。作為乙個立志在明年進入中科院軟體所的人,我怎麼可以這樣子?這麼關鍵的課程,怎麼可以落下。我感到很內疚。然而,此刻我終於不內疚了。在網上搜尋到...