Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly LC-3组件的扩展乘法_Assembly_Binary_Hex_Lc3 - Fatal编程技术网

Assembly 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

我正在尝试扩展乘法来处理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 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