我在P3汇编中做了一段代码,它迭代一个向量并打印该向量中的所有数字。问题是代码没有打印出向量的第9个值...我找不到问题所在。有人能帮我吗?下面是我的代码:
; TEMPORIZACAO
DELAYVALUE EQU F000h
; STACK POINTER
SP_INICIAL EQU FDFFh
; INTERRUPCOES (INTERRUPTS)
TAB_INT0 EQU FE00h
TAB_INT1 EQU FE01h
MASCARA_INT EQU FFFAh
; I/O a partir de FF00H
DISP7S1 EQU FFF0h
DISP7S2 EQU FFF1h
LCD_WRITE EQU FFF5h
LCD_CURSOR EQU FFF4h
LEDS EQU FFF8h
INTERRUPTORES EQU FFF9h
IO_CURSOR EQU FFFCh
IO_WRITE EQU FFFEh
LIMPAR_JANELA EQU FFFFh
XY_INICIAL EQU 0000h
FIM_TEXTO EQU '@'
ORIG 8000h
VarTexto1 STR 'Valores do vector: ',FIM_TEXTO
ORIG 8030h
vetor STR 67, 13, ffddh, 99, 12, 112, FFA6h, 65, 6AFFh
; 67, 13, -35, 99, 12, 112, -90, 65, 27391
ORIG 0000h
JMP inicio
LimpaJanela: PUSH R2 ; **CLEAR SCREEN
MOV R2, LIMPAR_JANELA
MOV M[IO_CURSOR], R2
POP R2
RET
PrintVec: PUSH R1
PUSH R2
PUSH R3
PUSH R4
PUSH R5
MOV R5, M[SP+8] ; Pointer to the start of the string
MOV R2, M[SP+7] ; Location of the first XY character
MOV R4, M[SP+9] ; Pointer to the first elemnt of the vector
MOV R3, M[SP+10] ; Size of the vector
Ciclo: MOV M[IO_CURSOR], R2
MOV R1, M[R5]
CMP R1, FIM_TEXTO
BR.Z Write
CALL EscCar
INC R5
INC R2
BR Ciclo
ADD R2, 1
Write: CALL PrintNum
INC R4
ADD R2, 6
DEC R3
BR.NZ Write
POP R4
POP R3
POP R2
POP R1
RETN 2 ; Actualiza STACK
PrintNum: PUSH R1
PUSH R3
PUSH R5
Convert: MOV R3, 10
MOV R5, M[R4]
ADD R5, R0
BR.NN LABEL2
MOV M[IO_CURSOR], R2
MOV R1, '-'
CALL EscCar
NEG R5
LABEL2: ADD R2, 4
LABEL3: MOV M[IO_CURSOR], R2
DIV R5, R3
MOV R1, R3
ADD R1, 48
CALL EscCar
MOV R3, 10
DEC R2
CMP R5, 0
BR.NZ LABEL3
POP R1
POP R3
POP R5
RETN 2 ; Actualiza STACK
EscCar: MOV M[IO_WRITE], R1
RET
;===============================================================================
; Programa prinicipal
;===============================================================================
inicio: MOV R1, SP_INICIAL
MOV SP, R1
CALL LimpaJanela ; Clear screen
PUSH 9
PUSH vetor
PUSH VarTexto1 ; Push parameters onto stack
PUSH XY_INICIAL ; Push parameters onto stack
CALL PrintVec
;===============================================================================
发布于 2015-05-07 01:58:16
这只是一种猜测,但它会导致文本对齐不正确,从而使第9个元素不可见。
顺便说一句:你必须在进入时记录函数的寄存器参数,并在退出时记录改变的寄存器。这是一个基本的新手失败。
发布于 2015-05-29 09:18:06
在使用RETN指令时存在一些问题。在function中,PrintVec应该是RETN 4,因为您从堆栈中获得了四个值(当您执行MOV R5、MSP+8/ MOV R2、MSP+7/ MOV R4、MSP+9/ MOV R3、MSP+10等时)。在function PrintNum中,您只需要使用RET指令,因为您不会从堆栈中获取任何值
https://stackoverflow.com/questions/30064849
复制相似问题