将以下代码翻译成汇编语言并显示 Y的最终值。(2分)
X = 1; Y = 2; WHILE(X <= 10 ){ IF((X%2) != 0) Y = Y * X; ELSE Y++; X++;} Output Y
如果我做的一切正确,请让我知道,因为我不确定我的输出是否正确。结果是3712
*-----------------------------------------------------------
* Title :
* Written by :
* Date :
* Description:
*-----------------------------------------------------------
ORG $1000
START: ; first instruction of program
* Put program code here
MOVE.W #1,D1 ;PUT 0 IN D1 (X)
MOVE.W #2,D2 ;PUT 1 IN D2 (Y)
LOOP CLR.W D3 ;Find the remainder
MOVE.W D1,D3
DIVU #2,D3
SWAP D3
CMP #0,D3 ;Compare remainder with 0
BNE NOTEQUAL ;If NOT equal, then go to NOT equal
ADD.W #1,D2 ;Y++
ADD.W #1,D1 ;X++
CMP #11,D1 ;Compare D1 with 11
BEQ DONE ;If D1 equals 11, break loop.
BRA LOOP
NOTEQUAL
MULU.W D1,D2 ;Multiply D1 and D2 and store it in D2
ADD.W #1,D1 ;X++
CMP #11,D1 ;Compare D1 with 11
BEQ DONE ;If D1 equals 11, break loop.
BRA LOOP
DONE LEA MESSAGE,A1
MOVE.W #14,D0
TRAP #15
MOVE.W D2,D1
MOVE.W #3,D0
TRAP #15
SIMHALT ; halt simulator
* Put variables and constants here
MESSAGE DC.W 'Y is: ',0
END START ; last line of source
答案 0 :(得分:2)
如果/**
*
* @param {object} formGroup form group to update
* @param {object} formValues the form control name as the key and the value to patch
*/
public patchMultipleValues(formGroup, formValues) {
for (let key in formValues) {
let keyToPatch = key;
let valueToPatch = formValues[key];
// Patch value
formGroup.patchValue({ [keyToPatch]: valueToPatch });
}
}
的高位字包含大于1的数据,将导致意外结果。
D3
如果您确实要使用LOOP CLR.W D3 ; D3 = [**** 0000]
MOVE.W D1,D3 ; D3 = [**** X]
DIVU #2,D3 ; if D3.h > 1, division overflows and D3 does not change
SWAP D3 ; Lower word is (X%2) or random data
,请确保清除长寄存器(使用DIVU
或实际上更快的clr.l d3
)。如果您随后将其覆盖,仅清除低位字毫无意义。
但是,正如@PeterCordes所说的那样,moveq #0,d3
效率很低,无法检查低位(我不会指出代码中的其他低效率之处)。最好使用DIVU
(如果该位为空,则设置btst #0,d1
标志)。
替代方法是:
Z
数字1和您要测试的值。如果最低位为空,还设置and.w
标志Z
标志)当然,您还可以部分展开循环,并利用C
每隔一次迭代为真的事实。并且您可以完全展开循环并将结果直接移到目标中(多数优化的编译器将能够执行此操作:https://godbolt.org/z/VGecJ3)。