我在P3 Assembly中完成了一段代码,它遍历一个向量并打印该向量中的所有数字。问题是代码没有打印向量的第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
;===============================================================================
答案 0 :(得分:0)
您的函数PrintNum:
没有PUSH
和POP
注册R2
,即输出的光标位置。它以R2
的方式摆弄着不明显的方式。这只是猜测,但它导致文本对齐关闭,使第9个元素不可见。
所以在PUSH R2
POP R2
和PrintNum:
顺便说一句:你必须记录你的功能'在入口处注册参数,在退出时更改寄存器。这是一个基本的noob失败,不是。
答案 1 :(得分:0)
使用 RETN 指令时存在一些问题。功能 PrintVec 应该是 RETN 4 ,因为您从堆栈中获取了四个值(当您执行 MOV R5时,M [SP +] 8] / MOV R2,M [SP + 7] / MOV R4,M [SP + 9] / MOV R3,M [SP + 10] 等)。在函数 PrintNum 中,您只需要指令 RET ,因为您没有从堆栈中获取任何值