1

我正在为我的一个班级做一些事情,但我被困在一个问题上,使我无法进步。

在下面第 10、14 和 16 行的代码中,我需要将相应的值打印出注释状态。目前,我使用testPrint稍微低一点的函数来打印出它的值 for AXand BXor AH, AL, BH, BL。我的问题是当我尝试在第 10 行打印出 vaules 并使用相同的函数在第 14 行打印出值时,第 14 行的值被弄乱了,并显示了一些不是正确答案的东西。当我让程序执行所有适当的功能时,如等ADDMUL并在最后打印一次,它可以完美运行。

我也只能使用其中一个测试打印功能,因为如果我尝试同时使用这两个功能,数字会变得混乱。

我正在使用 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                 !
4

1 回答 1

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

因为每个函数都需要 save 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
于 2013-04-29T04:12:43.737 回答