關於組合語言跳轉出範圍的問題,組合語言跳轉主程式,結果程式超出地址範圍是怎麼回事

2022-03-14 00:43:47 字數 4042 閱讀 3611

1樓:做而論道

像這種:jmp maina1 指令,轉移的範圍在 +-127位元組之內,程式編寫大了,超出範圍是常有的事。

可以在其範圍之內,加個「接力點」,再用ljmp轉移一次即可。

2樓:

跳轉出範圍,理論大家都講了,書上也很詳細,,,,,,來段實際的吧,

請把此段程式(新改):

maind2:

jb p3.5,maind3

jmp s14

maind3:

jb p3.6,maind4

jmp s15

maind4:

jb p3.7,maina1

jmp s16

替換原來程式的:

maind2:

jnb p3.5,s14

maind3:

jnb p3.6,s15

maind4:

jnb p3.7,s16

jmp maina1

新改程式功能保持,編繹通過,但如果在新改部分再增一指令,問題又來了,哈哈,,仔細看看,你很快就會明白的了

3樓:匿名使用者

頂樓上那個,完全正確。jnb是短轉移指令,你那s15離他太遠了,夠不著。。。。。

組合語言跳轉主程式,結果程式超出地址範圍是怎麼回事 5

4樓:做而論道

太遠了。

就跳兩次、跳三次、、

總會達到目的地的。

組合語言,跳轉指令問題:

5樓:承璣鈄曉暢

s0:那一行,若short條件滿足,測跳到s:那一行,若不滿足則向下執行s1:

那一行。s2:那一行若條件short滿足,則跳到s1:

那一行,若不滿足則順序執行下面的nop空操作!

6樓:

條件跳轉是根據標誌位跳轉,影響相應標誌位的指令就可以影響條件跳轉。

a&a=a

test %eax, %eax就是根據eax設定標誌位,他一定不會進位、溢位,of=0,

jg在以下情況下跳轉

sf=of且zf=0

所以,如果若eax為零,則不跳轉,若為負,則不跳轉,只有大於零(greater)才跳轉,

7樓:匿名使用者

test這裡是做按位與操作,test %eax, %eax是先將%eax和自己按位與,如果所得的結果》0,那麼就跳轉,否則繼續執行下面的指令。

這裡的trick是test一個暫存器本身就是看暫存器的值是不是0. 如果不是0,那麼jg一定會跳轉。

機器這樣寫的目的是減少指令所佔的空間(你可以嘗試用mov指令實現看暫存器的值是否為0這個需求,你會發現所佔的空間》test,我記得test是2個byte,而mov要有5個byte)

說完了,大清早的,希望對你有幫助!

問大家一個非常簡單的問題,組合語言中跳轉指令子程式執行完了以後跳轉到哪執行??

8樓:

繼續往下執行

舉個例子:

jmp loop

mov a,r2

.loop:mov a,43h

.mov r0,#40h

上面跳轉到loop後按照指令的順序,繼續往下執行就行了(就是mov r0,#40h),而不是mov a,r2;

如果是程式呼叫 就是回到你呼叫的地方 舉個例子:

call loop

mov a, r2

.loop:mov a,34h

.ret

mov r0,#40h

上面的ret就是回到呼叫的那(call loop ),執行它的下條語句(mov a,r2),而不是mov r0,#40h

不知道你的水平,我儘量詳細的解說,希望你能看懂,也許有點羅嗦…………

幾個關於組合語言的問題 急用 謝謝

9樓:

1.loop迴圈功能應配合哪個快取器

cx暫存器

loop指令,是迴圈指令,迴圈次數由計數暫存器cx指定。是否執行迴圈體的判斷指令在迴圈體之後,所以,至少執行1次迴圈體,即至少迴圈1次。執行loop指令時,cpu自動將cx的值減1,若cx=0,則結束迴圈;否則,重複執行迴圈體。

2.組合語言離開程式回到dos應使用哪個int功能。

mov ah,4ch

int 21h

3.簡介jmp/jc,cmp/pest用法。

計算機組合語言中的一種跳轉指令.當需要分支程式時,散轉程式有時可以幫我們實現。使用指令jmp @a+dptr,可實現多分支轉移。

它是根據某種輸入或運算的結果,分別轉向各個處理程式段取執行程式。

jmp $

就是跳轉到當前的地址, 所以它是一個死迴圈,不繼續執行下面的程式了。

jc addr

jump if carry:如果有進位則跳轉到addr

一般可以跟在cmp指令後面(2個無符號數相減)

表示目的運算元小於源運算元

cmp s,d

比較兩個數,影響暫存器

4.段處理器有哪幾個。

你問的是段暫存器麼?

5.reset後系統從哪個地址開始執行。

當我們按下電源開關時,電源就開始向主機板和其它裝置供電,此時電壓還不穩定,主機板控制晶片組會向cpu發出一個reset(重置)訊號,讓cpu初始化。當電源開始穩定供電後,晶片組便撤去reset訊號,cpu馬上就從地址ffff0h處開始執行指令,這個地址在系統bios的地址範圍內,無論是award bios還是ami bios,放在這裡的只是一條跳轉指令,跳到系統bios中真正的啟動**處。

有關於組合語言的問題

10樓:

指令格式:jmp short 標號。

這是一種段內相對轉移指令,目的運算元均用標號表示,程式轉向的有效地址等於當前ip暫存器的內容加上8位或者16位位移量。如果位移量是16位,那麼表示近轉移,說明目的地址與當前ip的距離在-32768~+32767個位元組之間。

如果轉移的範圍在-128~127個位元組之內,則稱為短轉移,指令中只需要用8位位移量,他是近轉移指令的一個特例。

11樓:匿名使用者

你就可以直接理解為跳到quest

12樓:匿名使用者

jmp short 是短跳轉,不能超過256個位元組,跳遠了就出錯。如果你的標號quest距離當前位置超過了128個位元組,編譯會出錯,你只能用jmp quest了。

jmp short 的好處是指令只佔兩個位元組,節省空間。

13樓:匿名使用者

短轉移,即8位轉移,指令中轉移的偏移地址只用一個位元組儲存,所以只能在-128到+127位元組(彙編為二進位制**後)之間轉移。

組合語言 8051 我要檢測多引腳,就是說超出jb或jnb跳轉範圍怎麼辦?有程式嗎?

14樓:做而論道

程式,編寫的長了,就會有《轉移太遠》的困擾。

只好,落腳在半途中,然後,再用 ljmp 轉移一次,即可到達任意的地址。

15樓:匿名使用者

jb bit, rel ; 如果超過跳轉範圍 可以加一條 ljmp rel 如

--------------- ; 指令 是 = 1 跳轉

jnb bit, $+6 ; 這裡 = 1 執行下一條指令 = 0 跳過下一條指令

ljmp rel

--------------- ; 或者這樣

jnb bit, loop ; 這裡 = 1 執行下一條指令 = 0 跳過下一條指令

ljmp rel

loop:

16樓:匿名使用者

是多按鍵掃描?

如果可能用中斷方式。。。

彙編指令延時的精確解釋,組合語言延時程式怎麼解釋?

2 123 2 248us中,的 2即分別是指令mov r6,123 和指令nop各一秒,即是所內迴圈。248 2 200 1 50.001ms 中 2即是指令djnz r7,dly1的用時,248 2 200即外迴圈,最後那個 1即指令mov r7,200的用時,不是ret的用時。我也喜歡微控制器...

將組合語言源程式翻譯成機器語言目標程式的是什麼

先通過 編譯程式 將組合語言源程式轉換為可重定位的目標程式,再通過 連結程式 生成不可重定位目標程式,再通過 目標程式轉換器 將其轉換為機器語言目標程式。這種工具稱為彙編器 assembler 組合語言是為特定計算機或計算機系列設計的一種面向機器的語言 由彙編執行指令和彙編偽指令組成。使用組合語言編...

組合語言中ADD加法指令的問題關於組合語言中ADD指令的問題

1.0ac72h只是一個表示方法,跟ac72h是一樣的含義。ax裡還是儲存16位的值。之所以在前面多加一個0,是因為編譯器不識別以字母開頭的立即數。算是立即數表示的一種規則吧,或者可以理解為是一種語法規則。只要是十六進位制數的 最後加h 首位又是字母的,必須前面新增個0。這樣也不容易引起歧義。如果不...