Why isn't my assembly program setting r1 to the correct value?

前端 未结 1 624
我在风中等你
我在风中等你 2020-11-29 14:12

I am writing an assembly program on the LC3 machine.

My assembly program is an LC3 program that multiplies R2 and R3 and stores the result in R1.

Here is

相关标签:
1条回答
  • 2020-11-29 14:27

    HALT is just a "pseudo-instruction" for a TRAP instruction used to halt the machine.

    You could write:

    TRAP x25  ;HALT the machine
    

    But in this way you need to remember the position in the TRAP vector, in this case x25. So is better to just use HALT instead.

    Others common TRAPs also have pseduo-instructions: IN, OUT, etc.

    I asume you want to store your results somewhere. You could do something like:

    ;Sets pc to this address at start of program 
    .ORIG x3000
    ;R1 will store the result lets clear it(ANd with 0)
    AND R1,R1,x0
    ;R2 will be multiplied by R3, let's clear both of them 
    AND R2,R2,x0
    AND R3,R3,x0
    ;Test case 4 * 3 = 12;
    ADD R2,R2,4
    ADD R3,R3,3
    ;Add to increment zone 
    LOOP Add R1,R1,R2;
    ;Decrement the counter, in this case the 3 or R3
    ADD R3,R3,x-1
    BrP LOOP
    ST R1, Result         ;STORE R1 at Result
    HALT
    Result .FILL x0000    ;this will be x000C=12h after execution
    .END
    

    ---------------------EDIT--------------------------

    About you last question (in comments):

    If HALT stops my program, how will Reslt .FILL x0000 directive run then?

    This is more a question about how assemblers works.

    The answer is because: Assembly Time != Execution Time

    Directives are considered at Assembly Time.

    In fact, Assembly Time is composed in two passes:

    1. Resolve symbols creating a symbol table
    2. Convert instructions to "truly executable/machine code" using the symbol table.

    This is a very common way to implement assemblers, and the LC3 assembler is not the exception.

    0 讨论(0)
提交回复
热议问题