Assembly 我需要在2d数组(部件)中找到最小数量

Assembly 我需要在2d数组(部件)中找到最小数量,assembly,x86-16,Assembly,X86 16,我不擅长组装,所以我做了这样的东西。问题是它不起作用。你能帮助我吗?我在网上冲浪,我看到一些代码可以找到相同元素的数量。我对它做了一点修改,但是关于move\u next有一些错误。 我的代码: STACK 256 .data array dw 1,2,3,4,5,6,7,8,9,0,11,12,13,14,15,16,17,18,19,20 min dw 1 .code main: mov ax,@data mov ds,ax xor

我不擅长组装,所以我做了这样的东西。问题是它不起作用。你能帮助我吗?我在网上冲浪,我看到一些代码可以找到相同元素的数量。我对它做了一点修改,但是关于
move\u next
有一些错误。 我的代码:

 STACK 256
 .data
     array dw 1,2,3,4,5,6,7,8,9,0,11,12,13,14,15,16,17,18,19,20
     min dw 1
 .code
 main:
     mov ax,@data
     mov ds,ax
     xor ax,ax
     mov si,0
     mov bx,0
     mov cx,5
 external:
     mov ax,array[bx][si]
     push cx
     mov cx,5
     mov si,0
 iternal:
     inc si
     cmp ax,min
     jle here
     loop iternal
 here:
     jcxz move_next 
     mov min, ax
     move_next      <==================== This is your first error
     pop cx
     add bx,1
     loop external
 output:
     mov ax,min 
      pop dx
          add dl, 30h  
     int 21h       
     loop output  
         mov ah, 09h
         int 21h              
     exit: ;выход
     mov ax,4c00h 
     int 21h
     end main

因为这是家庭作业,所以不会有完整的代码。而是一些指针

因此,您正在寻找2D数组中的最小值。您找到的示例执行嵌套循环严格地说,这不是必需的,除非您正在寻找最小元素的索引。由于数组在内存中是连续的,因此可以在一个循环中扫描整个数组并输出找到的最小值。在您的情况下,这意味着最初将
CX
初始化为20,并且没有内部循环

现在,关于扫描阵列的逻辑。它与C++中的类似,获取下一个元素,与运行的最小值比较,如果元素小于最小值,将元素值分配到最小值。汇编为这增加了一些味道

在C++函数中,你有一个索引变量,从0变为数组SIZE-1。这里也一样,只是需要考虑数组包含两个字节的字(声明为

DW

重述:

  • 初始化寄存器
  • 循环20次迭代
  • SI中的运行索引
  • 将当前元素加载到AX中
  • 将AX与正在运行的最小值进行比较
  • 如果较小,则将AX分配到运行的最小值
  • 增加指数
  • 继续循环
  • 输出和退出
你能做到吗?你对哪一部分不确定


关于比较。与C++等高级语言相比,这是汇编中不同的事情之一。CPU有一个
标志
寄存器,它根据上一次算术运算的结果更改其值。然后,可以基于各个标志值执行条件跳转。x86程序集中没有
if/else
语句本身,只有条件跳转

具体地说,当您想要执行
if(ax
时,在汇编中,它将是这样的:

    cmp ax, min      //Compare ax to min - the FLAGS are set
    jge not_less     //If ax >= min, jump to the not_less label.
                     //"ge" stands for "greater or equal"
    mov min, ax      //Else (that is, if ax < min), assign ax to min
not_less:            //This is the label
cmp ax,min//Compare ax to min-设置标志
jge not_less//如果ax>=min,跳转到not_less标签。
//“ge”代表“更大或相等”
mov min,ax//Else(即,如果ax

关于最新的编辑

首先,您有两次“输出数字”逻辑,一次在
putdigit
中,另一次在输出最小值的部分。只需将
putdigit
重新用于后者;它打印AX的值。将
min
加载到AX中并调用
putdigit

现在,关于打印阵列循环。您的
添加bx,cols
行已关闭;您希望将BX的值移动内存中的行大小,不是5而是10,因为您有一个两字节字的数组。此外,即使数字很小,适合一个字节,但加载高字节是不正确的;代替
mov-al[si][bx]
,执行
mov-ax[si][bx]
。由于您的汇编器似乎通过数组大小正确地缩放SI,而不是
adc SI,2
restore
inc SI
。这里的
ADC
命令毫无意义

您有两行
int 21h
行。第一个输出换行符,另一个没有意义。移除它


代码中还有许多其他问题,但让我们先解决这两个问题。

您能更详细地描述问题所在吗?您会收到什么样的错误?错误消息是什么?我
ve收到错误消息“未定义的符号移动\u下一步”。我不知道什么是问题。它告诉你问题所在<代码>下一步移动
未被识别为符号。尝试在定义
move\u next
的行中添加一个冒号。我应该怎么做?是构建第一个片段,还是构建第二个片段?第一个片段实际上没有
move\u next
标签,而是作为命令编写的,没有冒号。您了解命令和标签之间的区别吗?请参阅问题编辑。评论不用于扩展讨论;这段对话已经结束。
    cmp ax, min      //Compare ax to min - the FLAGS are set
    jge not_less     //If ax >= min, jump to the not_less label.
                     //"ge" stands for "greater or equal"
    mov min, ax      //Else (that is, if ax < min), assign ax to min
not_less:            //This is the label