cancel
Showing results for 
Search instead for 
Did you mean: 

Issues(?) with command ADDW and SUBW on STM8S105C6

Ivan Berton
Associate II
Posted on July 07, 2018 at 08:08

Hi

I use STM8S-Discovery Board with STM8S105C6 and ST Visual Develop v4.3.10, Windows 10.

If I use command ADDW or SUBW this way:

------------------------------------------------------------------------------

Example 1

                  ldw           X,&sharp400

         ;Load 400 into X

                  addw       X,&sharp100

          ;Add direct 100 to word X

test            cpw         X,&sharp500

         ;Compare X with 500

             

      jreq         test

               ;Jump to 'test' if X=500

------------------------------------------------------------------------------

it works properly. The content X is 500.

But if I do this

------------------------------------------------------------------------------

Example 2

k                equ           $0365

        ;RAM register is called k

                  mov          k,&sharp100

       ;Move 100 into k

                  ldw           X,&sharp400

       ;Load 400 into X

                  addw        X,k

             ;Add k to word X

test            cpw         X,&sharp500

       ;Compare X with 500

             

      jreq         test

             ;Jump to 'test' if X=500

------------------------------------------------------------------------------

it doesn�t work. The content of X is not 500.

SUBW behave the same way.

According the programming manual PM004 Doc ID 13590 Rev3, page 78 and 152,

Example 2 should actually work. Issue or do I miss something?

Thanks for reply.

Ivan 

#addw #subw #stm8s105c6 #assembly #basic-arithmetic
4 REPLIES 4
Posted on July 07, 2018 at 17:45

Dupe

https://community.st.com/0D50X00009XkVvrSAF

 

Doesn't seem to be getting much traction, options would be to contact local ST office, FAE for your account, or post an Online Support Request.

Tips, Buy me a coffee, or three.. PayPal Venmo
Up vote any posts that you find helpful, it shows what's working..
Posted on July 08, 2018 at 13:46

Thanks anyway.

Peter Suranyi
Associate
Posted on July 13, 2018 at 10:01

I think the problem is that the

instruction

 'ADDW' is word 

instruction,

and the variable 'k' is byte. In this example, on the $0365 address is #100=#$64 number. When ADDW X, k is executed, 'k' loaded  as #$64xx. 'xx' means we do not know what the number is at $0366 adress.

One repair option:

k equ $0365      ; the RAM register is called k 

   ldw X, # 100   ; Move 100 to X

   ldw k,X            ; move 100 to k address

   ldw X, # 400   ; Load 400 in X

   addw X, k         ; Add k to word X

test   cpw X, # 500; Compare X with 500 

   jreq test            ; Jump to 'test' if X = 500

Posted on July 16, 2018 at 09:28

 ,

 ,

Thanks for reply.

It seems I didn´t understood the loading mechanism with word and byte.

I thought k is added as byte to the lower part (XL) of X which acctualy is a byte too.

If I clear address $0366 first then k is loaded as ♯ $6400 when ADDW is executed. ,

ADDW X,k would then lead to X= ♯ 26000 ( ♯ $0190 + ♯ $6400 = ♯ $6590)

LDW  , , , , , ,X, ♯ 100 , , , ,,X loaded with ♯ $0064

LDW  , , , , , ,k,X  , , , , , , , , ,,leads to address $0365 with content ♯ $00 and $0366 with ♯ $64

LDW , , , , , ,X, ♯ 400 , , , , , ,,X loaded with ♯ $0190

ADDW , , , ,X,k , , , , , , , , , , , ,, ♯ $0190 + ♯ $0064 = ♯ $01F4 = ♯ 500

It works now.

Thanks!