2013-04-28 82 views
1

我正在爲一類我的一些東西工作,我被困在一個問題,以阻止我進步。裝配8088打印AX,BX,AH,AL,BH,BL

在下面的代碼行10,14和16我需要打印出各自的值,以評論的狀態。目前我使用testPrint功能打印出來的值爲AXBXAH,AL,BH,BL。 我的問題是,當我嘗試在第10行打印出值,並使用相同的函數打印第14行的值時,第14行的值被搞亂並顯示不正確的答案。當我讓程序執行所有適當的功能,如ADD,MUL等,並打印出來一次,它完美的作品。

我也只能使用其中一個測試打印功能,因爲如果我嘗試同時使用兩個數字,數字就會混亂起來。

我正在使用8088彙編程序。

我在調用每個打印函數後錯過了什麼嗎?任何人都可以展示給我看或告訴我我需要做什麼才能朝着正確的方向前進?

非常感謝你!

This is the code: 

_EXIT = 1  ! 1 
_PRINTF = 127  ! 2 
.SECT .TEXT   ! 3 
    start:   ! 4 
MOV AX, 514   ! 5 AX = 514 
MOV BX, 2  ! 6 BX = 2 

firstOutput:  ! 7output original values of AX and BX 
PUSH BX   ! 8 
PUSH AX   ! 9 
      ! 10 PRINT AX AND BX HERE (SHOULD BE 514,2) 

secondOutput:   ! 11 BH = BH + BL; AH= AH - AL 
ADDB BH, BL  ! 12 
SUBB AH, AL  ! 13 
      ! 14 PRINT AX AND BX HERE (SHOULD BE 2, 514) 

thirdOutput:  ! 15 MULTIPLY AX AND BX 
MUL BX   ! 16 
      ! 17 PRINT AH, AL, BH, BL 


!testPrint: !THIS WILL PRINT AX AND BX 
!PUSH BX 
!PUSH AX 
!PUSH print 
!PUSH _PRINTF 
!SYS 

testprintall: ! THIS WILL PRINT AH, AL, BH, BL 
MOV CX, 0   ! 
MOVB CL, BL   ! 
PUSH CX    ! 
MOVB CL, BH   ! 
PUSH CX    ! 
MOVB CL, AL   ! 
PUSH CX    ! 
MOVB CL, AH   ! 
PUSH CX    ! 
PUSH printahalbhbl ! 
PUSH _PRINTF  ! 
SYS ! 

exit:     ! Exit 
PUSH 0    ! 
PUSH _EXIT   ! 
SYS     ! 

.SECT .DATA   ! 
print:     ! 
.ASCIZ "AX:%d, BX:%d\n" ! 
.SECT .BSS     ! 

printahalbhbl:    ! 
.ASCIZ "AH:%d, AL:%d, BH:%d, BL:%d\n" ! 
.SECT .BSS     ! 
+0

你用什麼彙編器?你的目標是什麼操作系統? – nrz 2013-04-28 22:32:59

回答

2

兩件事情是缺少這裏:

首先是節省了_printf被允許改變所有的寄存器。 AX是其中之一。 其次是通話後清洗堆棧。通常被調用的函數不知道調用者將多少個參數放在堆棧上,因此這通常是調用者的責任。

push ax ;; or even pusha 
    push bx ;; 

    push ax 
    push bx 
    call xxx 
    pop ax ;; dummy pop to clean the stack 
    pop ax ;; stack cleaning 

    pop bx ;; restore BX 
    pop ax ;; restore ax 

因爲每一個功能是需要保存bp,它也可以通過

push bp 
    mov bp, sp 

    push ax ; arguments 
    push bx ; 
    call xxx  ;; 

    mov sp, bp 
    pop bp 

或通話後恢復堆棧時,這個局部棧幀概念是整個系統中使用:

mov [bp - xyz ], sp; // save current stack pointer at a fixed place 
    push cx ; // push a lot of arguments 
    call zyx 
    mov sp, [bp - xyz]  // restore stack pointer