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。這樣也不容易引起歧義。如果不...