计数 (HC11)
Counting number (HC11)
我还在玩这个MC
现在我想计算给定数组中的positive/negative个数字和0。在 c 语言中,我做了这样的事情,并且效果很好:
int A[15], pos, neg, nul, i;
[...]
pos = 0;
neg = 0;
nul = 0;
for 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
RESET EQU $FFFE
QUANTITY EQU 200
ORG RWM
POSITIVES RMB
NEGATIVES RMB
ZEROS RMB
ORG ROM
Main:
END BRA END
ARRAY DW 1,4,8,-87,0,0,1,4,5,8,7,4,4,1,-9
ORG RESET
DW Main
i'm a little confused right here because i would need to consider the
worst cases, i mean: all are positive, or all negative or all zero.
So, i should define variable sizes according to the information to be
saved.
I think the end of the array should be ARRAY + QUANTITY-1.
编辑#1:
对于这种情况,我想获得这个输出:
由于 ARRAY 包含这些元素:
1,4,8,-87,0,0,1,4,5,8,7,4,4,1,-9
我应该得到这个输出:
POSITIVES 11
NEGATIVES 2
ZEROS 2
但请记住:
i must consider the worst cases, i.e: all are positive, or all
negative or all zero
另一种情况:
假设我想获取存储在特定数组中的所有元素的绝对值。
我可以使用 'C' 来实现,我的意思是,我可以执行这样的操作:
#include <stdio.h>
#include <math.h>
int absolute(int *array, int N);
int main()
{
int array[16] = {0,1,2,3,-4,5,6,7,-8,9,-10,11,12,13,14,20};
int ray[16];
int i;
for ( i = 0; i < 16; i++ )
ray[i]=absolute(array,16);
printf("the absolute value is %d\n", ray[i]);
return 0;
}
int absolute(int *array, int N)
{
int i;
for(i=0; i<N; i++)
if (array[i]<0)
array[i] = array[i] * (-1);
}
我试图在汇编中这样做(使用 68hc11 指令)
RWM EQU [=15=]
ROM EQU $C000
RESET EQU $FFFE
ORG RWM
ABSOLUTE RMB
ORG ROM
Start:
END BRA END
ARRAY DW 4,144,447,-14,-555,-1147
ORG RESET
DW Start
我想在 ABSOLUTE 中存储来自 ARRAY[=59 的所有绝对元素=]
PS: i have not defined the size for ABSOLUTE
我想在 ABSOLUTE 中查看这些值:
4,144,447,14,555,1147 (UNSIGNED NUMBERS)
将 QUANTITY
定义为 200 在您的示例中似乎毫无意义,因为您对数组进行了硬编码,因此无论 QUANTITY
说什么,它都具有已知数量的元素。最好让汇编程序将 QUANTITY
定义为实际的元素数量,如下所示(但在我基于 ASM11 的示例中未使用)。
RAM equ [=10=]
ROM equ $C000
Vreset equ $FFFE
;*******************************************************************************
#ROM
;*******************************************************************************
org ROM
ARRAY dw 4,144,447,-14,-555,-1147
;QUANTITY equ *-ARRAY/2
;*******************************************************************************
#RAM
;*******************************************************************************
org RAM
absolute rmb ::ARRAY
zeros rmb 1
positives rmb 1
negatives rmb 1
;*******************************************************************************
#ROM
;*******************************************************************************
Start ldx #ARRAY ;X -> source
ldy #absolute ;Y -> destination
;-------------------------------------- ;initialize all counters to zero
clr zeros
clr positives
clr negatives
;--------------------------------------
Loop ldd ,x ;D = word to test
beq CountZero ;go count zero
bpl CountPositive ;go count positive number
;--------------------------------------
inc negatives ;count negative number
; negd ;make it positive (abs)
coma
comb
addd #1
bra Cont
;--------------------------------------
CountZero inc zeros
bra Cont
;--------------------------------------
CountPositive inc positives
; bra Cont
;--------------------------------------
Cont std ,y ;save absolute value
ldab #2 ;B = word size
abx ;X -> next word
aby ;Y -> next word
cpx #ARRAY+::ARRAY ;check for end of array
blo Loop ;repeat for all elements
bra *
org Vreset
dw Start
顺便说一句,您的 C 代码不正确。我想你是想写这样的东西:
#include <stdio.h>
#define SIZE 16
int absolute(int array[], int ray[], int N)
{
for (int i=0; i<N; i++)
ray[i] = array[i] * (array[i]<0?-1:1);
}
int main()
{
int array[SIZE] = {0,1,2,3,-4,5,6,7,-8,9,-10,11,12,13,14,20};
int ray[SIZE];
absolute(array,ray,SIZE);
for (int i = 0; i < SIZE; i++ )
printf("The absolute value of %3i is %3i\n", array[i],ray[i]);
return 0;
}
我还在玩这个MC
现在我想计算给定数组中的positive/negative个数字和0。在 c 语言中,我做了这样的事情,并且效果很好:
int A[15], pos, neg, nul, i;
[...]
pos = 0;
neg = 0;
nul = 0;
for 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
RESET EQU $FFFE
QUANTITY EQU 200
ORG RWM
POSITIVES RMB
NEGATIVES RMB
ZEROS RMB
ORG ROM
Main:
END BRA END
ARRAY DW 1,4,8,-87,0,0,1,4,5,8,7,4,4,1,-9
ORG RESET
DW Main
i'm a little confused right here because i would need to consider the worst cases, i mean: all are positive, or all negative or all zero. So, i should define variable sizes according to the information to be saved. I think the end of the array should be ARRAY + QUANTITY-1.
编辑#1:
对于这种情况,我想获得这个输出:
由于 ARRAY 包含这些元素:
1,4,8,-87,0,0,1,4,5,8,7,4,4,1,-9
我应该得到这个输出:
POSITIVES 11
NEGATIVES 2
ZEROS 2
但请记住:
i must consider the worst cases, i.e: all are positive, or all negative or all zero
另一种情况:
假设我想获取存储在特定数组中的所有元素的绝对值。
我可以使用 'C' 来实现,我的意思是,我可以执行这样的操作:
#include <stdio.h>
#include <math.h>
int absolute(int *array, int N);
int main()
{
int array[16] = {0,1,2,3,-4,5,6,7,-8,9,-10,11,12,13,14,20};
int ray[16];
int i;
for ( i = 0; i < 16; i++ )
ray[i]=absolute(array,16);
printf("the absolute value is %d\n", ray[i]);
return 0;
}
int absolute(int *array, int N)
{
int i;
for(i=0; i<N; i++)
if (array[i]<0)
array[i] = array[i] * (-1);
}
我试图在汇编中这样做(使用 68hc11 指令)
RWM EQU [=15=]
ROM EQU $C000
RESET EQU $FFFE
ORG RWM
ABSOLUTE RMB
ORG ROM
Start:
END BRA END
ARRAY DW 4,144,447,-14,-555,-1147
ORG RESET
DW Start
我想在 ABSOLUTE 中存储来自 ARRAY[=59 的所有绝对元素=]
PS: i have not defined the size for ABSOLUTE
我想在 ABSOLUTE 中查看这些值:
4,144,447,14,555,1147 (UNSIGNED NUMBERS)
将 QUANTITY
定义为 200 在您的示例中似乎毫无意义,因为您对数组进行了硬编码,因此无论 QUANTITY
说什么,它都具有已知数量的元素。最好让汇编程序将 QUANTITY
定义为实际的元素数量,如下所示(但在我基于 ASM11 的示例中未使用)。
RAM equ [=10=]
ROM equ $C000
Vreset equ $FFFE
;*******************************************************************************
#ROM
;*******************************************************************************
org ROM
ARRAY dw 4,144,447,-14,-555,-1147
;QUANTITY equ *-ARRAY/2
;*******************************************************************************
#RAM
;*******************************************************************************
org RAM
absolute rmb ::ARRAY
zeros rmb 1
positives rmb 1
negatives rmb 1
;*******************************************************************************
#ROM
;*******************************************************************************
Start ldx #ARRAY ;X -> source
ldy #absolute ;Y -> destination
;-------------------------------------- ;initialize all counters to zero
clr zeros
clr positives
clr negatives
;--------------------------------------
Loop ldd ,x ;D = word to test
beq CountZero ;go count zero
bpl CountPositive ;go count positive number
;--------------------------------------
inc negatives ;count negative number
; negd ;make it positive (abs)
coma
comb
addd #1
bra Cont
;--------------------------------------
CountZero inc zeros
bra Cont
;--------------------------------------
CountPositive inc positives
; bra Cont
;--------------------------------------
Cont std ,y ;save absolute value
ldab #2 ;B = word size
abx ;X -> next word
aby ;Y -> next word
cpx #ARRAY+::ARRAY ;check for end of array
blo Loop ;repeat for all elements
bra *
org Vreset
dw Start
顺便说一句,您的 C 代码不正确。我想你是想写这样的东西:
#include <stdio.h>
#define SIZE 16
int absolute(int array[], int ray[], int N)
{
for (int i=0; i<N; i++)
ray[i] = array[i] * (array[i]<0?-1:1);
}
int main()
{
int array[SIZE] = {0,1,2,3,-4,5,6,7,-8,9,-10,11,12,13,14,20};
int ray[SIZE];
absolute(array,ray,SIZE);
for (int i = 0; i < SIZE; i++ )
printf("The absolute value of %3i is %3i\n", array[i],ray[i]);
return 0;
}