48 lines
1.9 KiB
NASM
48 lines
1.9 KiB
NASM
// Multiplies R0 and R1 and stores the result in R2.
|
|
// (R0, R1, R2 refer to RAM[0], RAM[1], and RAM[2], respectively.)
|
|
|
|
@2 // Load RAM[2] address into A register
|
|
M=0 // Set RAM[2] to 0
|
|
@1 // Load RAM[1] into A register
|
|
D=M // Set D register to RAM[1]
|
|
@0 // Load RAM[0] into A register
|
|
D=D-M // Subtract RAM[0] from RAM[1] and store the result in D register
|
|
@SWAP
|
|
D;JLT // Swap RAM[0] and RAM[1] to optimize number of jumps
|
|
@LOOPCOND
|
|
0;JMP // Otherwise jump to loop condition
|
|
|
|
(SWAP)
|
|
@0 // Load RAM[0] address into register A
|
|
D=M // Set D register to RAM[0]
|
|
@3 // Load RAM[3] address into register A
|
|
M=D // Set RAM[3] to RAM[0]
|
|
@1 // Load RAM[1] address into register A
|
|
D=M // Set D register to RAM[1]
|
|
@0 // Load RAM[0] address into register A
|
|
M=D // Set RAM[0] to register D (RAM[1])
|
|
@3 // Load RAM[3] address into register A
|
|
D=M // Set D register to RAM[3]
|
|
@1 // Load RAM[1] address into register A
|
|
M=D // Set RAM[1] to register D (RAM[3])
|
|
|
|
(LOOPCOND)
|
|
@0 // Load RAM[0] address into A register
|
|
D=M // Set D register to RAM[0]
|
|
@LOOP
|
|
D;JGT // If D > 0 goto LOOP
|
|
@END
|
|
0;JMP // When D > 0 goto end
|
|
(LOOP)
|
|
@1 // Load RAM[1] address into A register
|
|
D=M // Set D register to RAM[1]
|
|
@2 // Load RAM[2] address into A register
|
|
M=D+M // Add content of D register to RAM[2] and store result in RAM[2]
|
|
@0 // Load RAM[0] address into A register
|
|
MD=M-1 // Subtract one from RAM[0] storing the results in RAM[0] and the D register
|
|
@LOOPCOND
|
|
D;JGT // If D > 0 goto LOOP
|
|
(END)
|
|
@END
|
|
0;JMP
|