- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试让扩展乘法在 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
请注意,子程序 PRINT 和 SHIFT 只是将 R0 的内容以位形式打印到控制台,并分别对 R0 的内容执行右移。请假设它们正常工作(我已经多次测试它们并且它们是)。
因此,该代码应该计算两个 N 位无符号整数的双字乘积。当然,乘积存储在两个连续的字中,“最低有效”位存储在低地址字中。
在 XMULT 子例程中,我使用 R3(ACCumulator 的 ACC)和 R1(MultiPlieR 的 MPR)分别存储乘积的“最高有效”部分和“最低有效”部分。这些是使用标准的通用乘法算法计算的
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)
}
因此在循环结束时,双字乘积在 ACC:MPR 中可用。
当循环终止时,ACC 似乎存储了正确的值,但 MPR 却没有。例如,取值X和Y,查阅位乘计算器显示x1234 * xABCD = xC374FA4
现在,如果我运行我的代码并乘以 X 和 Y,一旦乘法循环终止,ACC(乘积的最重要部分)存储 b0000 1100 0011 0111 = x0C37,因此这部分似乎是正确的。但是,MPR 存储零 (b0000 0000 0000 0000 = x0000)。
在过去的几个小时里,我一直在我的 LC-3 模拟器上使用断点和 Step Into 函数逐步检查我的代码,试图弄清楚为什么会发生这种情况,这是我唯一能做的值得注意的是,在乘法循环期间发生的逻辑右移在循环终止之前将 MPR 减少到 0(尽管 ACC 获得了正确的值)。
正如我所说,所有子例程(逻辑右移的 SHIFT 是其中最重要的子例程)都在正常工作,并且 MULOOP 之类的 SEEMS 正确实现了通用乘法算法,那么为什么 MPR 会被清零?
更令人困惑的是,我尝试将 x0100 和 x0200 相乘(只是为了尝试两个简单的数字),我得到了正确答案:x0002 存储在 ACC 中,x0000 存储在 MPR 中,使得乘积 x20000(自 ACC是产品最重要的部分,MPR 是最不重要的部分)。
不知道怎么回事。几个小时以来,我一直在转动轮子尝试各种事情:
我改变了操作数的顺序(交换了乘数和被乘数),这当然对乘法无关紧要,但我很绝望
我尝试了一种完全不同的逻辑右 SHIFT 实现,它也是正确的。不出所料,结果和原来的一模一样
我已经更改了循环计数器的值,试图查看较少的循环迭代是否会导致 MPR 在循环终止之前不被清零。答案:确实如此,但正如预期的那样,这会导致 ACC 不再在循环终止时存储正确的值。此外,MPR 也不会存储正确的值 - 它只是不会以零结束(如果我使用较小的计数器)。
我真的被难住了。是我的乘法循环的实现有问题,还是有其他问题?我什至不知道去哪里寻找错误了。
最佳答案
快速提问:
PRINT 过程是否保留 R6
?否则,您需要使用额外的 LEA R6, ARGS
指令为第二个和第三个参数重新加载它。
ShiftRight(ACC:MPR)
ShiftRight(ACC)
ShiftRight(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
在程序的这一部分中,您执行 2 个完全独立的操作。您将 R3
(ACC) 中的单词向右移动,并将 R1
(MPR) 中的单词向右移动。
但是您忘记了 ACC:MPR 应该是 32 位的数量。在 ACC 右侧移出的位必须在 MPR 左侧移入。由于这没有发生,您最终得到一个空的 MPR。
你应该做什么:
If Bit(ACC,0) = 0
ShiftRight(ACC)
ShiftRight(MPR)
Else
ShiftRight(ACC)
ShiftRight(MPR)
Add(MPR,32768)
Endif
关于assembly - 难倒在 LC-3 组装的扩展乘法上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47741238/
在组装方面,我绝对是个初学者。我尝试找出以下内容的输出应该是什么: Jan dd 255,256 Feb dw 16, 17, 18, 19 Mar db 8, 9, 10, 11 Sub edi,
我正在用 AT&T 语法编写。这个循环应该检查大小写是否在 61-7A ASCII 范围内(这意味着是这个小字母) - 如果不是,则将其转换为空格“”。 change: movb (%esi)
mov eax, ptr_to_num1 ; little endian mov ebx, ptr_to_num2 ; little endian xor ecx, ecx xor edx, edx
我正在制作用于组装的 atoi 函数。 无论我尝试什么都行不通,我也不知道为什么。 有谁知道是什么问题? org 100h mov si, stri ;parameter call atoi
我正在使用 tasm 编写汇编程序。我的任务是编写一个程序,该程序将使用冒泡排序按字母顺序对输入的字符串进行排序。前任。如果你输入“hello”,它应该写成“ehello”。我已经写了请求输入字符串并
假设我的 GPU 包含一个名为 ADT7473 的芯片。 . 我有兴趣从该芯片接收有关我的卡温度的信息。 我的问题是,如何访问这个芯片?是使用 IN/OUT 指令完成的吗? 编辑: 我可能会添加芯片文
我需要在DOS下通过Assembly(intel)+C(c99)绘制QRCode。但看来我的内存太少了。我尝试将图像存储为位数组: image db 11111110b, ... 但无论如何我没有结果
这里有一个简短的问题。我有一个程序集被一些开发人员重复使用,其中包含各种功能,但在技术上分为代表功能逻辑 block 的各种命名空间。 现在,它提供的公共(public) namespace 越少越好
小端: mov eax,4 push dword 0x44434241 mov ebx,1 mov ecx,esp mov edx,4 int 0x80 add esp,4 我不明白为什么它打印 A
是否可以使用元编程技巧来允许在 assembly block 上使用 SFINAE?例如检测处理器上是否有类似“CPUID”的指令:(这不是有效的代码,但说明了我想要实现的目标) // This sh
我有以下形式的项目 - pom.xml - projectA - pom.xml - src/main/ - java - startupScript - projectB
在《微处理器的音乐应用》一书中,作者给出了以下算法,将两个 8 位有符号整数与 16 位有符号结果进行 4 象限相乘: 对原始操作数进行无符号乘法。然后为了更正结果,如果被乘数符号为负,则无符号单精度
我们有一个项目,我们正在 build 大量 Scalatra microservices通过使用 sbt-assembly 打包它们插件,然后使用 sbt-docker 创建 Docker 镜像插入。
所有使用布局的 assemble 用户都知道“{{> body }}”标记了任何使用布局的页面的内容插入点。但是是否可以定义多个插入点,而不是将所有内容都扔到 {{> body }} 所在的位置? 例
我刚开始学习汇编,我没有找到任何有用的内容。 我正在创建一个简单的程序来读取用户输入,基本上: section .bss opA: resw 1 opB: resw 1 section
我目前正在尝试在 bochs 中编译并运行一个简单的引导加载程序。目前,这是我的 bootloader.asm 文件: [BITS 16] [ORG 0x7C00] ;Where the code g
我正在组装一个“simon”游戏,我需要在按钮打开时发出蜂鸣声,蜂鸣声也应该彼此不同。谢谢 最佳答案 您可以使用speaker让您的设计保持简单。 扬声器可让您播放不同频率的方波,it can act
我无法通过任何文档找到问题的答案。 可靠集合通过云的多个节点共享,并且具有名称和持久性。 它们可以通过不同的应用程序共享还是特定于应用程序? 例如,两个不同的 MVC 应用程序对同一帐户托管的可靠字典
嗨,我有一个 SBT 构建文件,用于处理我们组织内的集成测试,测试本身可以工作,我可以单独运行单元和它测试。但是,当使用 sbt-assemble 打包应用程序时,我无法按顺序运行两个测试(unit+
我正在运行一些汇编代码,但我无法弄清楚一行代码的作用。代码是: leaq 0(,%rax,4), %rdx 我知道lea基本上是一种mov指令,但它只移动地址。因此,我们将某些内容的地址移动到%
我是一名优秀的程序员,十分优秀!