組合語言跳轉問題?

時間 2021-06-01 18:42:39

1樓:韋易笑

怎麼還在學 16 位彙編呀?什麼年代了?程序還要自己操作段位址。

你理解錯了

call

word

ptrds

:[0eh

]發生的是

push ip

jmp word ptr ds:[0eh]同時push

ip展開是:

decsp,2

movword

ptrss

:[sp

],ip

所以完整展開

call

word

ptrds

:[0eh

]相當於

decsp,2

; --> 此時 sp = 0eh

movword

ptrss

:[sp

],next_ip

jmpword

ptrds

:[0eh

]next_ip:

incax

incax

incax

...相當於:

decsp,2

; --> 此時 sp = 0eh

movword

ptrss

:[sp

],next_ip

jmpnext_ip

next_ip:

incax

incax

incax

...要問ax的值:

movax,0

; ----- AX = 0

call

word

ptrds

:[0eh

]inc

ax; ----- AX = 1

incax

; ----- AX = 2

incax

; ----- AX = 3

movax

,4c00h

; ----- AX = 0x4c00

int21h

; ----- AX = 0, 呼叫 DOS 「結束程式」 功能,AX被置為0 表示成功

code

ends

endstart

所以剛執行完三個 inc以後,ax=3,但最終程式結束後,AX的值是0,你可以 debug 跑跑試試。---

為什麼在組合語言中需大量使用跳轉指令,而在C語言中卻盡量避免使用goto語句呢?

因為組合語言是低階語言,早期的組合語言根本就是機器指令的助記符,並不支援結構化程式設計,沒有if else這些東西,所有的分支都是靠跳轉或條件跳轉來實現。後期雖然有了巨集彙編,有IF巨集 ELSE巨集這些用了,但是巨集彙編使用起來還是不方便,還有不少問題。C語言就不同了,作為幾乎是最早一批的高階語言...

學習組合語言有什麼好處?

藍芽彪 效能要求比較高的地方其實是可以用C替代的.但有個地方C比較難解決基本靠彙編,晶元補丁.參考RAM的補丁機制,最近跟彙編幹上了.果斷拿出大一學習的彙編基礎操刀上. 最近在研究hotspot,然後發覺不懂作業系統根本不能理解很多知識點,然後研究作業系統,發覺要懂彙編,然後學習彙編,然後你就會覺得...

除了組合語言,其他語言是否都會先轉為 C 語言?

Interlock C語言並不是基礎,在C語言出現之前就有很多很多程式語言了。C語言也是為了方便程式設計師使用才被製作出來的。C語言衍生出了很多類C語言。當然還有更多的語言和C語言毫無瓜葛。當乙個編譯器設計者想要實現一門語言的時候,至少有兩個方案可以選,乙個是將該語言直接轉換成機器碼,另乙個是將該語...