<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > 8086指令系統---控制轉移指令(二)

8086指令系統---控制轉移指令(二)

作者: 時(shí)間:2016-11-27 來(lái)源:網(wǎng)絡(luò ) 收藏
  3 循環(huán)指令


  這一組指令在循環(huán)結構的程序中用來(lái)控制一段程序(稱(chēng)為循環(huán)體)的重復執行,在匯編指令中循環(huán)的轉向地址用標號來(lái)表示,而在機器指令中給出的是位移量,所以執行循環(huán)指令時(shí),若滿(mǎn)足循環(huán)條件,CPU就計算轉向地址:(IP)當前+8位位移量→(IP),即實(shí)現循環(huán)。

  若不滿(mǎn)足循環(huán)條件,即退出循環(huán),程序繼續順序執行。
  循環(huán)指令都是短轉移格式的指令,也就是說(shuō),位移量是用8位帶符號數來(lái)表示的,轉向地址在相對于當前IP值的-128 ~ +127字節范圍之內。

  對條件循環(huán)指令LOOPZ(LOOPE)和LOOPNZ(LOOPNE),除測試CX中的循環(huán)次數外,還將ZF的值作為循環(huán)的必要條件,因此,要注意將條件循環(huán)指令緊接在形成ZF的指令之后。

  在多重循環(huán)的程序結構中,如果各層循環(huán)都使用循環(huán)指令來(lái)控制,則應注意對CX中循環(huán)計數值的保存與恢復。
循環(huán)指令均不影響條件碼。

本文引用地址:http://dyxdggzs.com/article/201611/322187.htm

  LOOP  label    循環(huán)(loop)
  執行操作:① (CX)←(CX)-1
      ?、?若(CX)≠0,則(IP)←(IP)當前+位移量,否則循環(huán)結束

  LOOPZ/LOOPE label 為零/相等時(shí)循環(huán)(loop while zero,or equal)
  執行操作:① (CX)←(CX)-1
      ?、?若ZF=1且(CX)≠0,則(IP)←(IP)當前+位移量,否則循環(huán)結束

  LOOPNZ/LOOPNE label 不為零/不等時(shí)循環(huán)(loop while nonzero,or not equal)
  執行操作:① (CX)←(CX)-1
      ?、?若ZF=0且(CX)≠0,則(IP)←(IP)當前+位移量,否則循環(huán)結束

例編寫(xiě)程序,實(shí)現兩個(gè)數據塊BLOCK1和BLOCK2相加,結果存入BLOCK2。
       DATA   SEGMENT
       BLOCK1   DW   100 DUP(?)
       BLOCK2   DW   100 DUP(?)
       DATA  ENDS
       ; - - - - - - - - - - - - - - - - - -
       CODE   SEGMENT
       ASSUME CS:CODE,DS:DATA,ES:DATA
    START:MOV   AX,DATA
       MOV   DS,AX        ; initialize the data segment
       MOV   ES,AX        ; initialize the extra segment
       CLD             ; DF=0 for autoincrement
       MOV   CX,100        ; load the counter
       MOV   SI,OFFSET BLOCK1  ; address of block1
       MOV   DI,OFFSET BLOCK2  ; address of block2
    NEXT: LODSW            ; load the data of block1 into AX
       ADD   AX,ES:[DI]     ; add the data of block2 to AX
       STOSW            ; store the sum to block2
       LOOP   NEXT        ; repeat 100 times
       MOV   AX,4C00H      ; return to DOS
       INT   21H
    CODE  ENDS
       END   START

 4 子程序調用與返回指令

  子程序是一種非常重要的計算機編程結構,它存儲在存儲器中,可供一個(gè)或多個(gè)調用程序(主程序)反復調用。主程序調用子程序時(shí)使用CALL指令,由子程序返回主程序時(shí)使用RET指令。由于調用程序和子程序可以在同一個(gè)代碼段中,也可以在不同的代碼段中,因此,CALL指令和RET指令也有近調用、近返回及遠調用、遠返回兩類(lèi)格式。

?、?CALL NEAR PTR SUBPROUT 近調用(near call)
  近調用是CALL指令的缺省格式,可以寫(xiě)為"CALL subrotine"。它調用同一個(gè)代碼段內的子程序(子過(guò)程),因此,在調用過(guò)程中不用改變CS的值,只需將子程序的地址存入IP寄存器。CALL指令中的調用地址可以用直接和間接兩種尋址方式表示。

?、?CALL FAR PTR SUBPROUT 遠調用(far call)
  遠調用適用于調用程序(也稱(chēng)為主程序)和子程序不在同一段中的情況,所以也叫做段間調用。和近調用指令一樣,遠調用指令中的尋址方式也可用直接方式和間接方式。

?、?RET 返回指令(return)
  RET指令執行的操作是把保存在堆棧中的返回地址出棧,以完成從子程序返回到調用程序的功能。

  ● CALL SUBROUT 段內直接調用
  執行操作:① (SP) ← (SP)-2,((SP)) ← (IP)當前
      ?、?(IP) ← (IP)當前+16位位移量(在指令的第2、3個(gè)字節中)
  
  ● CALL DESTIN 段內間接調用
  執行操作:① (SP) ← (SP)-2,((SP)) ← (IP)當前
      ?、?(IP) ← (EA) ; (EA)為指令尋址方式所確定的有效地址

  ● CALL FAR PTR SUBROUT 段間直接調用
  執行操作:① (SP) ← (SP)-2,((SP)) ← (CS)當前
         (SP) ← (SP)-2,((SP)) ← (IP)當前
      ?、?(IP) ← 偏移地址(在指令的第2、3個(gè)字節中)
         (CS) ← 段地址(在指令的第4、5個(gè)字節中)

  ● CALL WORD PTR DESTIN 段間間接調用
  執行操作:① (SP) ← (SP)-2,((SP)) ← (CS)當前
         (SP) ← (SP)-2,((SP)) ← (IP)當前
      ?、?(IP) ← (EA) ; (EA)為指令尋址方式所確定的有效地址
         (CS) ← (EA+2)

  從CALL指令執行的操作可以看出,第一步是把子程序返回調用程序的地址保存在堆棧中。對段內調用,只需將IP的當前值,即CALL指令的下一條指令的地址存入SP所指示的堆棧字單元中。對段間調用,保存返回地址則意味著(zhù)要將CS和IP的當前值分別存入堆棧的兩個(gè)字單元中。

  CALL指令的第二步操作是轉子程序,即把子程序的入口地址交給IP(段內調用)或CS:IP(段間調用)。對段內直接方式,調轉的位移量,即子程序的入口地址和返回地址之間的差值就在機器指令的2、3字節中。對段間直接方式,子程序的偏移地址和段地址就在操作碼之后的兩個(gè)字中。對間接方式,子程序的入口地址就從尋址方式所確定的有效地址中獲得。

  ● RET 段內返回(近返回)
  執行操作:(IP) ← ((SP)),(SP) ← (SP)+2

  ● RET 段間返回(遠返回)
  執行操作:(IP) ← ((SP)),(SP) ← (SP)+2
       (CS) ←((SP)),(SP) ← (SP)+2

  ● RET N 帶立即數返回
  執行操作:① 返回地址出棧(操作同段內或段間返回)
      ?、?修改堆棧指針:(SP) ← (SP)+N

  子程序的最后一條指令必須是RET指令,以返回到主程序。如果是段內返回,只需把保存在堆棧中的偏移地址出棧存入IP即可,如果是段間返回,則要把偏移地址和段地址都從堆棧中取出送到IP和CS寄存器中。

  帶立即數返回指令,除完成偏移地址出?;蚱频刂泛投蔚刂烦鰲5牟僮魍?,還要再使SP的內容加上一個(gè)立即數N,使堆棧指針SP移動(dòng)到新的位置。指令中的N可以是一個(gè)常數,也可以是一個(gè)表達式。帶立即數返回指令適用于C或PASCAL的調用規則,這些規則在調用過(guò)程(子程序)前先把參數壓入堆棧,子程序使用這些參數后,如果在返回時(shí)丟棄這些已無(wú)用的參數,就在RET指令中包含一個(gè)數字,它表示壓入到堆棧中參數的字節數,這樣堆棧指針就恢復到參數入棧前的值。

  CALL指令和RET指令都不影響條件碼。

 例根據下面調用程序和子程序的程序清單,畫(huà)出RET指令執行前和執行后的堆棧情況。假設初始的SS:SP=A000:1000。
 
    0000  B8 001E   MOV  AX,30
    0003  BB 0028   MOV  BX,40
    0006  50      PUSH AX     ; push data1 into stack
    0007  53      PUSH BX     ; push data2 into stack
    0008  E8 0066   CALL ADDM    ; call subroutine
    000B  B4 02    MOV  AH,2
    …   …      …
    0071  ADDM     PROC NEAR  ; entry point (IP)←0071=000b+0066
    0071  55      PUSH BP     ; save BP
    0072  8B E4    MOV  BP,SP    ; addressing the stack with BP
    0074  8B 46 04  MOV  AX,[BP+4] ; get data2 from stack
    0077  03 46 06   ADD  AX,[BP+6] ; add data1
    007A  CD      POP  BP     ; get back BP
    007B  C2      0004 RET 4   ; return and revert SP
    007E  ADDM     ENDP

圖 CALL指令和RET指令對堆棧的影響



  如圖3.12所示,主程序中的兩條PUSH指令將數據30和40壓入堆棧,CALL指令執行后,返回地址000B又壓入堆棧,緊接著(zhù)程序控制轉移到子程序ADDM。子程序中的PUSH指令又使BP的值進(jìn)棧,此時(shí)SP指向棧頂0FFA。MOV指令將0FFA傳送給BP,使BP作為尋址堆棧數據的指針。(BP+4)指向的是40,(BP+6)指向的是30,取出數據后用POP指令恢復了BP原先的值,此時(shí),(SP)=0FFC,這是RET 4指令執行前的堆棧狀態(tài)。


上一頁(yè) 1 2 下一頁(yè)

關(guān)鍵詞: 8086指令系統控制轉移指

評論


技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>