正负零(组装)
Positive, negative and zero (assembly)
我正在对旧 MCU (68hc11) 进行编程,我正在尝试使用 68hc11 指令从 C 语言迁移到汇编代码。
我想用汇编语言编写一个程序来计算给定数组中存在的正值、负值和零值的数量。请注意,ARRAY 中的所有值都可以全为正数或全为负数或全为零,你明白吗?所以我应该定义将正确存储数量的变量的大小。
注意:数组的结尾是:ARRAY+QUANTITY-1
Array: contains some random values
QUANTITY: represent the highest number of elements that the ARRAY can
hold
我用 C:
写了这个程序
int A[15], pos, neg, nul, i;
[...]
pos = 0;
neg = 0;
nul = 0;
for (i = 0; i < 15; i++) {
if (A[i] > 0) {
pos++;
}
if (A[i] < 0) {
neg++;
}
if (A[i] == 0) {
nul++;
}
}
现在,我想翻译它,但是在汇编中(我卡在这里,我没有得到我想要的)
RWM EQU [=11=]
ROM EQU $C000
VRESET EQU $FFFE
QUANTITY EQU 800 ;MEANS THE MAXIMUM AMOUNT OF VALUES THAT THE ARRAY WILL CONTAIN
ORG RWM
POSITIVE RMB 2
NEGATIVE RMB 2
ZEROS RMB 2
ORG ROM
START:
CLRA
CLRB
CLR POSITIVE
CLR ZEROS
CLR NEGATIVE
LDY #ARRAY
LOOP
CPY #(ARRAY+QUANTITY-1)
BHI END
LDD 0,Y
INY
BLT NEGATIVE_NUMBER
BEQ ZERO_NUMBER
BGE POSITIVE_NUMBER
NEGATIVE_NUMBER INC NEGATIVE
BRA LOOP
POSITIVE_NUMBER INC POSITIVE
BRA LOOP
ZERO_NUMBER INC ZEROS
BRA LOOP
END BRA END
ARRAY DW 78,554,-44,-4,2547,0,-3,0,1,7,8,
ORG VRESET
DW START
我的代码有什么问题?
编辑:
RWM EQU [=12=]
ROM EQU $C000
VRESET EQU $FFFE
QUANTITY EQU 800 ;MEANS THE MAXIMUM AMOUNT OF VALUES THAT THE ARRAY WILL CONTAIN
ORG RWM
POSITIVE RMB 2
NEGATIVE RMB 2
ZEROS RMB 2
ORG ROM
START:
CLRA
CLRB
CLR POSITIVE
CLR ZEROS
CLR NEGATIVE
LDY #(ARRAY-2)
LOOP
INY
INY
CPY #(ARRAY+2*QUANTITY-1)
BHI END
LDD 0,Y
BLT NEGATIVE_NUMBER
BEQ ZERO_NUMBER
BGE POSITIVE_NUMBER
NEGATIVE_NUMBER INC NEGATIVE
BRA LOOP
POSITIVE_NUMBER INC POSITIVE
BRA LOOP
ZERO_NUMBER INC ZEROS
BRA LOOP
END BRA END
ARRAY DW 78,554,-44,-4,2547,0,-3,0,1,7,8,
ORG VRESET
DW START
我得到了这个输出(不确定)
What's wrong with my code?
我只是快速浏览了你的程序,所以我的回答可能是错误的:
LDD 0,Y
很明显,您正在使用 16 位数字进行操作。否则,您将使用 LDA
或 LDB
而不是 LDD
.
CPY #(ARRAY+QUANTITY-1)
如果 QUANTITY
是以字节为单位的数组大小(例如,int A[15]
为 30),这将是正确的。
如果QUANTITY
是元素的个数,而你用的是16位的数,你要乘以2:
CPY #(ARRAY+2*QUANTITY-1)
INY
这同样适用于 8 位元素。对于 16 位元素,您必须向每个元素添加两个或递增 Y
两次:
INY
INY
INY
BLT NEGATIVE_NUMBER
INY
指令将修改零标志,因此影响BLT
、BGE
和BEQ
指令。 LDD
和分支指令之间不能使用 INY
。
BLT ...
BEQ ...
BGE ...
不是真正的错误,但 BGE
指令总是会分支。您可以将POSITIVE_NUMBER
数字代码放在BEQ
指令之后并删除BGE
指令。
编辑
I'm not understanding this part: INY
followed by Bxx
我正在考虑三种不同的方法来做到这一点。最简单的好像是:
LDY #(ARRAY-2) ; Because we'll do INY twice right now
LOOP
INY
INY
CPY #(ARRAY+2*QUANTITY-1)
BHI END
LDD 0,Y
BLT NEGATIVE_NUMBER
...
我正在对旧 MCU (68hc11) 进行编程,我正在尝试使用 68hc11 指令从 C 语言迁移到汇编代码。
我想用汇编语言编写一个程序来计算给定数组中存在的正值、负值和零值的数量。请注意,ARRAY 中的所有值都可以全为正数或全为负数或全为零,你明白吗?所以我应该定义将正确存储数量的变量的大小。
注意:数组的结尾是:ARRAY+QUANTITY-1
Array: contains some random values
QUANTITY: represent the highest number of elements that the ARRAY can hold
我用 C:
写了这个程序int A[15], pos, neg, nul, i;
[...]
pos = 0;
neg = 0;
nul = 0;
for (i = 0; i < 15; i++) {
if (A[i] > 0) {
pos++;
}
if (A[i] < 0) {
neg++;
}
if (A[i] == 0) {
nul++;
}
}
现在,我想翻译它,但是在汇编中(我卡在这里,我没有得到我想要的)
RWM EQU [=11=]
ROM EQU $C000
VRESET EQU $FFFE
QUANTITY EQU 800 ;MEANS THE MAXIMUM AMOUNT OF VALUES THAT THE ARRAY WILL CONTAIN
ORG RWM
POSITIVE RMB 2
NEGATIVE RMB 2
ZEROS RMB 2
ORG ROM
START:
CLRA
CLRB
CLR POSITIVE
CLR ZEROS
CLR NEGATIVE
LDY #ARRAY
LOOP
CPY #(ARRAY+QUANTITY-1)
BHI END
LDD 0,Y
INY
BLT NEGATIVE_NUMBER
BEQ ZERO_NUMBER
BGE POSITIVE_NUMBER
NEGATIVE_NUMBER INC NEGATIVE
BRA LOOP
POSITIVE_NUMBER INC POSITIVE
BRA LOOP
ZERO_NUMBER INC ZEROS
BRA LOOP
END BRA END
ARRAY DW 78,554,-44,-4,2547,0,-3,0,1,7,8,
ORG VRESET
DW START
我的代码有什么问题?
编辑:
RWM EQU [=12=]
ROM EQU $C000
VRESET EQU $FFFE
QUANTITY EQU 800 ;MEANS THE MAXIMUM AMOUNT OF VALUES THAT THE ARRAY WILL CONTAIN
ORG RWM
POSITIVE RMB 2
NEGATIVE RMB 2
ZEROS RMB 2
ORG ROM
START:
CLRA
CLRB
CLR POSITIVE
CLR ZEROS
CLR NEGATIVE
LDY #(ARRAY-2)
LOOP
INY
INY
CPY #(ARRAY+2*QUANTITY-1)
BHI END
LDD 0,Y
BLT NEGATIVE_NUMBER
BEQ ZERO_NUMBER
BGE POSITIVE_NUMBER
NEGATIVE_NUMBER INC NEGATIVE
BRA LOOP
POSITIVE_NUMBER INC POSITIVE
BRA LOOP
ZERO_NUMBER INC ZEROS
BRA LOOP
END BRA END
ARRAY DW 78,554,-44,-4,2547,0,-3,0,1,7,8,
ORG VRESET
DW START
我得到了这个输出(不确定)
What's wrong with my code?
我只是快速浏览了你的程序,所以我的回答可能是错误的:
LDD 0,Y
很明显,您正在使用 16 位数字进行操作。否则,您将使用 LDA
或 LDB
而不是 LDD
.
CPY #(ARRAY+QUANTITY-1)
如果 QUANTITY
是以字节为单位的数组大小(例如,int A[15]
为 30),这将是正确的。
如果QUANTITY
是元素的个数,而你用的是16位的数,你要乘以2:
CPY #(ARRAY+2*QUANTITY-1)
INY
这同样适用于 8 位元素。对于 16 位元素,您必须向每个元素添加两个或递增 Y
两次:
INY
INY
INY BLT NEGATIVE_NUMBER
INY
指令将修改零标志,因此影响BLT
、BGE
和BEQ
指令。 LDD
和分支指令之间不能使用 INY
。
BLT ... BEQ ... BGE ...
不是真正的错误,但 BGE
指令总是会分支。您可以将POSITIVE_NUMBER
数字代码放在BEQ
指令之后并删除BGE
指令。
编辑
I'm not understanding this part:
INY
followed byBxx
我正在考虑三种不同的方法来做到这一点。最简单的好像是:
LDY #(ARRAY-2) ; Because we'll do INY twice right now
LOOP
INY
INY
CPY #(ARRAY+2*QUANTITY-1)
BHI END
LDD 0,Y
BLT NEGATIVE_NUMBER
...