Assembly LC-3组件的扩展乘法
我正在尝试扩展乘法来处理LC-3。我的代码的相关摘录:Assembly LC-3组件的扩展乘法,assembly,binary,hex,lc3,Assembly,Binary,Hex,Lc3,我正在尝试扩展乘法来处理LC-3。我的代码的相关摘录: .ORIG x3000 ; Calculate AB = A x B LEA R6, ARGS LD R0, B STR R0, R6, #0 ; Store B into Multiplier address of ARGS JSR PRINT LD R0, A STR R0, R6, #1 ; Store A into Mul
.ORIG x3000
; Calculate AB = A x B
LEA R6, ARGS
LD R0, B
STR R0, R6, #0 ; Store B into Multiplier address of ARGS
JSR PRINT
LD R0, A
STR R0, R6, #1 ; Store A into Multiplicand address of ARGS
JSR PRINT
LEA R0, AB ; R0 <- starting address of AB
STR R0, R6, #2 ; Store starting address of AB into Product word of ARGS
JSR XMULT
; DID WE LOAD THE PRODUCT PROPERLY?
; THIS SHOULD PRINT THE LEAST SIGNIFICANT BITS OF PRODUCT
LDR R0, R0, #0
JSR PRINT
; THIS SHOULD PRINT THE MOST SIGNIFICANT BITS OF PRODUCT
LEA R0, AB
ADD R0, R0, #1
LDR R0, R0, #0
JSR PRINT
; Calculate XY = X * Y
TRAP x25
; Test Data
A .FILL x0010
B .FILL x00AB
X .FILL x1234
Y .FILL xABCD
AB .BLKW 2
XY .BLKW 2
; Argument List
ARGS .BLKW 1 ;Multiplier (value)
.BLKW 1 ;Multiplicand (value)
.BLKW 1 ;Product (address)
;**********************************************************
XMULT ;Extended Multiplication
;Arguments located by R6
; multiplier (value)
; multiplicand (value)
; product (address)
ST R7, XMU7 ;Save Registers
ST R0, XMU0 ; TEMP register (for storing temp results and passing to RightShift subroutine)
ST R1, XMU1 ; Will store MPR (Multiplier)
ST R2, XMU2 ; Will store MND (Multiplicand)
ST R3, XMU3 ; Will store ACC (Accumulator)
ST R4, XMU4 ; Will serve as a COUNTER for loop
ST R5, XMU5 ; Will store BITMASK for testing
ST R6, XMU6 ; Argument list
LDR R1, R6, #0 ; Store MPR into R1 (Multiplier is first item in the argument list pointed to by R6)
LDR R2, R6, #1 ; Store MND into R2 (Multiplicand is second item)
AND R3, R3, #0 ; ACC <- 0
LD R4, COUNTER ; Set counter
LD R5, BITMASK ; Set R5 to 0000 0000 0000 0001, the bitmask needed to test MPR[0]
; Counter and operands ready - now we can start the loop
MULOOP ; MUltiplication LOOP
AND R0, R5, R1 ; Test MPR[0]
BRz ELSE ; Branch if MPR[0] isn't set
ADD R3, R3, R2 ; ACC <- ACC + MND
ELSE
AND R0, R0, #0 ; Clear R0
ADD R0, R3, #0 ; R0 <- ACC
JSR SHIFT ; ShiftRight(ACC)
ADD R3, R0, #0 ; R3 <- Right-shifted ACC
ADD R0, R1, #0 ; R0 <- MPR
JSR SHIFT ; ShiftRight(MPR)
ADD R1, R0, #0 ; R1 <- Right-shifted MPR
ADD R4, R4, #-1 ; Decrement Counter
BRp MULOOP ; If Counter > 0, branch to beginning of loop
MULOOPEND ; MUltiplication LOOP ends here
; Write results to memory addresses (OUT-parameter segment)
LDR R0, R6, #2 ; R0 <- Product(address), least significant digit
STR R1, R0, #0 ; Right-shifted MPR goes in the lower address word
STR R3, R0, #1 ; Right-shifted ACC goes in the higher address word
LD R7, XMU7 ; Restore Registers
LD R0, XMU0
LD R1, XMU1
LD R2, XMU2
LD R3, XMU3
LD R4, XMU4
LD R5, XMU5
LD R6, XMU6
RET
XMU0 .BLKW 1
XMU1 .BLKW 1
XMU2 .BLKW 1
XMU3 .BLKW 1
XMU4 .BLKW 1
XMU5 .BLKW 1
XMU6 .BLKW 1
XMU7 .BLKW 1
; Data
COUNTER .FILL x0010
BITMASK .FILL x0001
.ORIG x3000
; 计算AB=A x B
LEA R6,ARGS
LD R0,B
STR R0,R6,#0;将B存储到ARGS的乘法器地址中
JSR打印
LD R0,A
STR R0,R6,#1;将A存储到ARGS的被乘数地址中
JSR打印
lear0,AB;R0快速问题:
打印程序是否保留R6
?如果没有,您需要为第二个和第三个参数重新加载它,并提供额外的lear6,ARGS
说明
实际上,您并没有ShiftRight(ACC:MPR)
您ShiftRight(ACC)
ShiftRight(MPR)
关于打印过程:如果preserve的意思是“保存和恢复”,那么就不是,但实际上它不使用R6。它使用R0-R4和R7。对不起,如果这不是你的意思!关于“我应该做什么”的代码:位(ACC,0)是否指ACC的第0位(即序列中最低有效位)的检查?如果是这样,这个检查会在你从我的代码中引用的块中的第一行之后进行吗(即加法R0,R3,#0)?如果它没有被截断,那也同样好。除了我关于位(ACC,0)的问题之外:Else底部的ADD指令中的32768是否对应于十六进制值x8000(即b1000 0000)?程序中的代码段仅与If
部分对应。显然,(最低位的)测试必须在采取任何行动之前进行。因此,我刚刚根据您的建议完成了一些代码的实现。它工作得很好。非常感谢你的帮助。
MPR <- Multiplier
MND <- Multiplicand
ACC <- 0
for (int k = 1; k <= N; k++)
{
if (MPR[0]) // Test MPR[0]
ACC <- ACC + MND
ShiftRight(ACC:MPR)
}
ADD R0, R3, #0 ; R0 <- ACC
JSR SHIFT ; ShiftRight(ACC)
ADD R3, R0, #0 ; R3 <- Right-shifted ACC
ADD R0, R1, #0 ; R0 <- MPR
JSR SHIFT ; ShiftRight(MPR)
ADD R1, R0, #0 ; R1 <- Right-shifted MPR
If Bit(ACC,0) = 0
ShiftRight(ACC)
ShiftRight(MPR)
Else
ShiftRight(ACC)
ShiftRight(MPR)
Add(MPR,32768)
Endif