汇编程序任务 - 数组的最小值和最大值
Posted
技术标签:
【中文标题】汇编程序任务 - 数组的最小值和最大值【英文标题】:Assembler task - min and max values of the array 【发布时间】:2010-01-20 11:57:41 【问题描述】:我遇到了汇编代码问题。我是汇编程序的新手,所以我自己似乎很难解决它。
任务是:“找到数组的最小和最大元素。”
我已经完成的只是搜索最大元素。我不知道如何检查最小元素以及我应该在哪里进行此类验证。或者,也许,我应该在找到最大元素后第二次遍历元素?
代码:
#include <conio.h>
#include <stdio.h>
#include <iostream.h>
void main()
int N = 10, i;
clrscr();
// on this platform, int is 16-bit
int a[] = 1, 4, -6, 12, -25, 10, 3, -4, 15, 7, MAX, MIN, RESULT;
__asm
mov cx, N
lea si, a
lodsw
mov bx, ax
mov dx, ax
dec cx
m:
__asm
lodsw
cmp dx, ax
jge m1
mov dx, ax
m1:
__asm
loop m
mov MAX, dx
cout << "Max = " << MAX;
//cout << "Min = " << MIN;
getch();
【问题讨论】:
最好在计算最大值的同一循环中计算最小值,也就是说,对于每个元素,当你将它放在寄存器中时,同时测试它的最小值测试它的最大值。在标签m1
似乎是正确的地方。
感谢您的帮助。我已经了解算法,如何实现这种验证,但不幸的是我无法编写代码来使这段代码可行。
【参考方案1】:
如果将“jge”替换为“jle”会怎样?试试看。
【讨论】:
结果将等于 '-25' - 数组的最小值。 非常好。现在您有两个循环,一个用于计算最小值,一个用于计算最大值。您需要做什么才能将它们组合成一个循环?提示:您的循环已经在初始化两个寄存器(bx 和 dx),但目前只使用其中一个。【参考方案2】:如果有人感兴趣,这里是我的问题的解决方案(我今天在导师的帮助下找到了它):
#include <conio.h>
#include <stdio.h>
#include <iostream.h>
void main()
int N = 10, i;
clrscr();
int a[] = 1, 4, -6, 12, -25, 10, 3, -4, 15, 7, MAX, MIN, RESULT;
__asm
mov cx, N
lea si, a
lodsw
mov MIN, ax
mov MAX, ax
dec cx
m:
__asm
lodsw
cmp MIN, ax
jle m1
mov MIN, ax
jmp m2
m1:
__asm
cmp MAX, ax
jge m2
mov MAX, ax
m2:
__asm
loop m;
cout << "Max = " << MAX << "\n";
cout << "Min = " << MIN;
getch();
算法:如果cmp MIN, ax
的结果是否定的,则表示ax
大于MIN
。因此脚本跳转到m1
标签以将ax
值与MAX
进行比较。当cmp MIN, ax
返回正值时,脚本将ax
寄存器的值分配给MIN
变量,然后跳转到m2
标签以递减循环计数器。寻找最大值的算法的工作原理类似(标签m1
)。
【讨论】:
以上是关于汇编程序任务 - 数组的最小值和最大值的主要内容,如果未能解决你的问题,请参考以下文章
有没有办法读取 4 个不同的数组以在 C 的返回函数中生成最小值和最大值
python编写程序,利用元组作为函数的返回值,求系列类型的最大值、最小值和元素个数