как работает этот код и есть ли ошибка в подпрограмме ADD3? - PullRequest
0 голосов
/ 09 июля 2020

; Шаблон кода ассемблера MSP430 для использования с кодом TI Composer Studio

- Код начинается с (Z0) - в подпрограмме вычисляется сумма PAR4 = PAR4 + PAR1 + PAR2 + PAR3, но как?

_main:      mov.w #0400h,SP ;(Z0)
            mov.w #WDTPW+WDTHOLD,&WDTCTL
Mainloop:   mov #0Ah, R5
            push PAR1
            push PAR2
            push PAR3
            push PAR4
            call #ADD3
            pop result
            jmp Mainloop
ADD3:       mov 0(SP), R14
            mov 2(SP), R10
            mov 4(SP), R11
            mov 6(SP), R12
            mov 8(SP), R13
            add R13, R10
            add R12, R10
            add R11, R10
            add #4, R1
            mov R10, 2(SP)
            mov R14, 0(SP)
            RET

1 Ответ

0 голосов
/ 15 июля 2020

Вот закомментированная программа, в ней есть ошибки.

_main:      mov.w #0400h,SP ;(Z0)   //initialize stack
            mov.w #WDTPW+WDTHOLD,&WDTCTL  //stop watchdog
Mainloop:   mov #0Ah, R5  //??!? useless?
            push PAR1  //parameters to the stack, ERROR; PAR1-4 are not defined anywhere
            push PAR2
            push PAR3
            push PAR4
            call #ADD3  //call subrutine
            pop result  //pop result in PAR4 from the stack to a location called result that isn't defined anywhere. ERROR

            <<ERROR: here some pops for the other three parameters in the stack are missing and will lead to stack overflow>>

            jmp Mainloop //main loop
ADD3:       mov 0(SP), R14  //save return address, useless!
            mov 2(SP), R10  //save parameters to registers R10-R13
            mov 4(SP), R11
            mov 6(SP), R12
            mov 8(SP), R13
            add R13, R10    //sum other parameters to R10
            add R12, R10
            add R11, R10
            add #4, R1      //useless????
            mov R10, 2(SP)  //update PAR4 in stack to sum value
            mov R14, 0(SP)  //restore return address, useless!
            RET             //return from subroutine (restores 0(SP) to PC and do SP+=2)
...