P3装配 - 打印矢量值

时间:2015-05-05 23:20:30

标签: assembly vector ascii processador-p3

我在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
;===============================================================================

2 个答案:

答案 0 :(得分:0)

您的函数PrintNum:没有PUSHPOP注册R2,即输出的光标位置。它以R2的方式摆弄着不明显的方式。这只是猜测,但它导致文本对齐关闭,使第9个元素不可见。

所以在PUSH R2

的进/出时添加POP R2PrintNum:

顺便说一句:你必须记录你的功能'在入口处注册参数,在退出时更改寄存器。这是一个基本的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 ,因为您没有从堆栈中获取任何值