Assembly z80的组装气泡排序

Assembly z80的组装气泡排序,assembly,bubble-sort,z80,Assembly,Bubble Sort,Z80,我有一份大学作业。我需要为z80处理器做一个汇编程序。程序应执行以下操作 从0201H开始,有20个数字存储在20个连续内存地址中。 程序应首先检查0200H中存储的数字。如果值为0,则程序应按升序排序,否则按降序排序。最后,排序结束后,程序应计算这20个数字的平均值 我知道这个问题不是根据网站的规则形成的,但我真的需要帮助 这里是Z-80汇编语言的快速指南。可以把它想象成C,但是去掉了大部分功能。基本上,您只有几个变量可以使用: unsigned char A; unsigned short

我有一份大学作业。我需要为z80处理器做一个汇编程序。程序应执行以下操作

从0201H开始,有20个数字存储在20个连续内存地址中。 程序应首先检查0200H中存储的数字。如果值为0,则程序应按升序排序,否则按降序排序。最后,排序结束后,程序应计算这20个数字的平均值


我知道这个问题不是根据网站的规则形成的,但我真的需要帮助

这里是Z-80汇编语言的快速指南。可以把它想象成C,但是去掉了大部分功能。基本上,您只有几个变量可以使用:

unsigned char A;
unsigned short BC, DE, HL, IX, IY;
unsigned char memory[65536];
没有结构,没有块,没有for或while循环,还有一种混乱的if。有一个goto,它将跳转到一个标签。或者您可以调用一个类似于子例程的标签,但它不接受任何参数并返回void。我们总是可以从这些部分构建更多的功能,但是对于简单的程序,我们拥有的变量和一些内存[]就足够了

您可以使用=进行赋值,但有很多规则。例如,所有这些都是合法的:

A = memory[26];
memory[738] = A;
A = memory[BC];
memory[DE] = A;
但不能使用任何旧的表达方式,如:

A = memory[BC + DE];
短变量可以分配给内存[]或从内存[]分配给内存[]或从内存[]分配给内存[]或从内存[]分配给内存[]或从内存[]分配给内存[]或从内存[]分配给内存[]或从内存[]分配给内存[],但由于短变量比char大,因此会自动拆分短变量。当你说memory[15]=BC;它认识到它不适合您,并代表您这样做:

memory[15] = BC % 256;
memory[16] = BC / 256;
更有用的是,当你说BC=memory[15]时,情况正好相反:

更奇怪的是,你可以把BC的这些高、低部分单独地说成B和C,但你不能说B=内存[25]。如果需要,您需要使用as in中介:

A = memory[25];
B = A;
DE可以被称为D和E,HL可以被称为H和L,但不是IX和IY,不是法律上的,但我们不要讨论这个问题

所有变量都可以递增和递减。A=A+1或A++如果你愿意的话。A=A-1。与BC、DE、HL、IX、B、C等相同

你能做D=D+2吗?不你必须做D++;D++;。说到数学,A是特别的。可以向其添加任何无符号字符或常量。或者减去。有一些逻辑操作,如&、|和^,但我们不必担心这些。您还可以添加或减去任何无符号字符变量,如D或L。但您不能添加或减去内存[]。这也必须分块进行。假设您需要A=A+内存[84]:

是的,它会变得单调乏味。人们开始欣赏编译器。您还可以对HL、IX和IY进行加减,但在更有限的情况下:

HL = HL + BC;
HL = HL + DE;
HL = HL + HL;  // Same as HL = 2 * HL.
IX = IX + BC;
IX = IX + DE;
IX = IX + IX;
// And follow the same pattern for IY
乘和除呢?不,不支持。不过,使用循环和位移位运算符,您可以设法模拟它们。或者效率较低,可以通过重复加法进行乘法,通过重复减法进行除法

但是循环呢?你可以用这样的东西来填满记忆:

HL = 9; // You can assign constants to all your variables, thankfully.
A = 0;
loop:
  memory[HL] = A;
  HL = HL + 1;
  goto loop;
HL = 9;
A = 0;
B = 10;
loop:
  memory[HL] = A;
  HL++;
  B = B - 1;
  if (B == 0) goto loop
loop:
  memory[HL] = 0; // turns out we can do this
  HL = HL + 1;
  B = B + 1;
  A = C;
  A = A - B;
  goto done if zero;
  goto loop;
done:
我提到过你的程序存在于内存中吗?不是这样的,这是个问题。如果你只想清除10个内存[],你会怎么做?这里是精神错乱的if进来的地方。你想写这样的东西:

HL = 9; // You can assign constants to all your variables, thankfully.
A = 0;
loop:
  memory[HL] = A;
  HL = HL + 1;
  goto loop;
HL = 9;
A = 0;
B = 10;
loop:
  memory[HL] = A;
  HL++;
  B = B - 1;
  if (B == 0) goto loop
loop:
  memory[HL] = 0; // turns out we can do this
  HL = HL + 1;
  B = B + 1;
  A = C;
  A = A - B;
  goto done if zero;
  goto loop;
done:
[Ooops,这是一个bug。应该是!=0,但假装它是正确的;我太懒了,无法重新键入这些内容。] 但是如果B==0是不受支持的。太复杂了。但如果为零,则有一个goto循环;这是什么意思?好的,每次你做数学运算,处理器都会记住一些关于结果的事情。一是如果结果等于零。事实证明,我们可以简单地将其替换为:

我们将循环10次。我们甚至可以概括代码,比如说,清除C给出的大量内存[]项。如何?只要B还不等于C,就让B计数并循环返回。如果B==C,我们不能这样做,但是我们可以从C中减去B,然后检查一个零的结果,这是同样的事情。我们不能做C=C-B,只有A能做。循环将如下所示:

HL = 9; // You can assign constants to all your variables, thankfully.
A = 0;
loop:
  memory[HL] = A;
  HL = HL + 1;
  goto loop;
HL = 9;
A = 0;
B = 10;
loop:
  memory[HL] = A;
  HL++;
  B = B - 1;
  if (B == 0) goto loop
loop:
  memory[HL] = 0; // turns out we can do this
  HL = HL + 1;
  B = B + 1;
  A = C;
  A = A - B;
  goto done if zero;
  goto loop;
done:
很尴尬,但会有用的。设计师们有些仁慈。如果结果不是零,您可以转到:

A = A - B;
goto loop if not zero;
如果结果小于或大于零,则允许进行其他一些测试。但简单的零测试可以让我们走得更远

特例比比皆是。如果我们不小心写了这样的话:

loop:
  memory[HL] = 0;
  B = B - 1;
  HL = HL + 1;
  goto loop if not-zero;
看起来像只虫子,不是吗。我们不做B次迭代,而是继续进行,直到HL变为0。但事实并非如此。当我们加或减一个短值,如HL,它不会影响零/非零条件。代码将起作用。事实上,Z-80的设计者认为这是一个特点

我要提到的另一件事是函数调用或子例程,如果你愿意的话。考虑到每一件小事都需要详细说明,你可以看到,即使是一个简单的函数,将一个数字乘以4,也会很好。但是有 e没有参数,也没有返回值。不能说像B=mult4B这样的话;相反,我们只是建立一些约定,在这些约定中,我们决定哪些变量或内存位置专门用于传递参数以及结果的去向。然后打电话的人想弄明白。我们可以定义一个子例程,它将B乘以4,并在a中返回结果:

如果我们不想把D乘以4,我们会这样做:

B = D;
mult4();
D = A;
很公平。我们还必须记住,mult4在一个函数中抹去了值,所以如果需要,我们最好保存它。就这一点而言,我们自己必须用B来打电话。如果我们需要这些变量,那么我们只需要找个地方把它们藏在内存[]中

这就是Z-80汇编语言编程。哦,还有很多其他的东西。你说的每一句话都带着口音,但如果你查找有关Z-80汇编语言的信息,我相信你会明白的。以下是几个例子:

A = memory[4];               LD A,(4)
A = 3;                       LD A,3
memory[2] = A;               LD (2),A
A = A + B;                   ADD A,B
B = B + 1;                   INC B
祝你作业顺利。

对于任何使用Z80汇编代码的人来说都是必读的。经作者许可可下载

顺便说一下,这本书中包含的一个代码示例是冒泡排序,自上而下进行了解释


有关Z80的更多信息,请访问。

关于什么的帮助?想必你们知道z80汇编是如何工作的,否则他们不会给它分配任务,是吗?气泡排序也很容易找到。不是我们的教授。他随机分配任务。基本上我不知道z80或组装。你能帮帮我吗?我想学吧。至少足够写冒泡排序。截止日期是什么时候?我想如果你在伊藤工作,你可以在一周内完成这件事,怀旧!这是我30年前做的事-