2012-11-27 87 views
1

以下兩個代碼示例中s和sf之間的實際差異是什麼?堆棧相對vs堆棧延期尋址

據我所知棧相對看起來像Mem [SP + OprndSpec]並且看起來像Mem [Mem [SP + OprndSpec]]。然而我不明白的是這是如何實現的。

堆棧遞延

  BR  main 
a:  .BLOCK 2   ;global variable #2d 
b:  .BLOCK 2   ;global variable #2d 
; 
;******* void swap (int& r, int& s) 
r:  .EQUATE 6   ;formal parameter #2h 
s:  .EQUATE 4   ;formal parameter #2h 
temp: .EQUATE 0   ;local variable #2d 
swap: SUBSP 2,i  ;allocate #temp 
     LDA  r,sf  ;temp = r 
     STA  temp,s 
     LDA  s,sf  ;r = s 
     STA  r,sf 
     LDA  temp,s  ;s = temp 
     STA  s,sf 
     RET2    ;deallocate #temp, pop retAddr 
; 
;******* void order (int& x, int& y) 
x:  .EQUATE 4   ;formal parameter #2h 
y:  .EQUATE 2   ;formal parameter #2h 
order: LDA  x,sf  ;if (x > y) 
     CPA  y,sf 
     BRLE endIf 
     LDA  x,s  ; push x 
     STA  -2,s 
     LDA  y,s  ; push y 
     STA  -4,s 
     SUBSP 4,i  ; push #r #s 
     CALL swap  ; swap (x, y) 
     ADDSP 4,i  ; pop #s #r 
endIf: RET0    ;pop retAddr 

; 
;******* main() 
main: STRO msg1,d  ;cout << "Enter an integer: " 
     DECI a,d  ;cin >> a 
     STRO msg1,d  ;cout << "Enter an integer: " 
     DECI b,d  ;cin >> b 
     LDA  a,i  ;push the address of a 
     STA  -2,s 
     LDA  b,i  ;push the address of b 
     STA  -4,s 
     SUBSP 4,i  ;push #x #y 
     CALL order  ;order (a, b) 
ra1:  ADDSP 4,i  ;pop #y #x 
     STRO msg2,d  ;cout << "Ordered they are: " 
     DECO a,d  ;  << a 
     STRO msg3,d  ;  << ", " 
     DECO b,d  ;  << b 
     CHARO '\n',i  ;  << endl 
     STOP 
msg1: .ASCII "Enter an integer: \x00" 
msg2: .ASCII "Ordered they are: \x00" 
msg3: .ASCII ", \x00" 
     .END 

堆棧相對

  BR  main   
; 
;******* int binomCoeff (int n, int k) 
retVal: .EQUATE 10   ;returned value #2d 
n:  .EQUATE 8   ;formal parameter #2d 
k:  .EQUATE 6   ;formal parameter #2d 
y1:  .EQUATE 2   ;local variable #2d 
y2:  .EQUATE 0   ;local variable #2d 
binCoeff:SUBSP 4,i   ;allocate #y1 #y2 
if:  LDA  k,s   ;if ((k == 0) 
     BREQ then   
     LDA  n,s   ;|| (n == k)) 
     CPA  k,s   
     BRNE else   
then: LDA  1,i   ;return 1 
     STA  retVal,s  
     RET4    ;deallocate #y2 #y1, pop retAddr 
else: LDA  n,s   ;push n - 1 
     SUBA 1,i   
     STA  -4,s   
     LDA  k,s   ;push k 
     STA  -6,s   
     SUBSP 6,i   ;push #retVal #n #k 
     CALL binCoeff  
ra2:  ADDSP 6,i   ;pop #k #n #retVal 
     LDA  -2,s  ;y1 = binomCoeff (n - 1, k) 
     STA  y1,s   
     LDA  n,s   ;push n - 1 
     SUBA 1,i   
     STA  -4,s   
     LDA  k,s   ;push k - 1 
     SUBA 1,i   
     STA  -6,s   
     SUBSP 6,i   ;push #retVal #n #k 
     CALL binCoeff  
ra3:  ADDSP 6,i   ;pop #k #n #retVal 
     LDA  -2,s  ;y2 = binomCoeff (n - 1, k - 1) 
     STA  y2,s   
     LDA  y1,s  ;return y1 + y2 
     ADDA y2,s   
     STA  retVal,s  
endIf: RET4    ;deallocate #y2 #y1, pop retAddr 
; 
;******* main() 
main: STRO msg,d  ;cout << "binCoeff (3, 1) = " 
     LDA  3,i   ;push 3 
     STA  -4,s   
     LDA  1,i   ;push 1 
     STA  -6,s   
     SUBSP 6,i   ;push #retVal #n #k 
     CALL binCoeff  
ra1:  ADDSP 6,i   ;pop #k #n #retVal 
     DECO -2,s  ;<< binCoeff (3, 1) 
     CHARO '\n',i  ;cout << endl 
     STOP     
msg:  .ASCII "binCoeff (3, 1) = \x00" 
     .END     
+2

你的代碼格式非常糟糕,這使得人們不想讀你的問題。 –

+0

對不起,我把它清理乾淨了。 – Zzz

回答

1

你的問題似乎很簡單,並沒有什麼其他的代碼比他們可能含有的例子。

(我不熟悉這個指令集,但都被編碼在裝配很長一段時間。)

根據您提供的定義,「堆相對」意味着採取從內存中的項目在一個位置由堆棧指針確定,加上一個可能嵌入在指令中的常量偏移量。這被大多數人稱爲索引尋址,特別說明它是堆棧指針索引。

「延遲」(舊稱)通常意味着「通過內存位置間接」,並且您的定義與此想法一致:找到「堆棧相對」位置,讀取該位置,並將該值用作內存位置取回。