首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >P3程序集-打印向量的值

P3程序集-打印向量的值
EN

Stack Overflow用户
提问于 2015-05-06 07:20:30
回答 2查看 509关注 0票数 0

我在P3汇编中做了一段代码,它迭代一个向量并打印该向量中的所有数字。问题是代码没有打印出向量的第9个值...我找不到问题所在。有人能帮我吗?下面是我的代码:

代码语言:javascript
运行
复制
; 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
;===============================================================================
EN

回答 2

Stack Overflow用户

发布于 2015-05-07 01:58:16

这只是一种猜测,但它会导致文本对齐不正确,从而使第9个元素不可见。

顺便说一句:你必须在进入时记录函数的寄存器参数,并在退出时记录改变的寄存器。这是一个基本的新手失败。

票数 0
EN

Stack Overflow用户

发布于 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指令,因为您不会从堆栈中获取任何值

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30064849

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档