Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 程序集:最大数量:未正确比较_Assembly_X86 16 - Fatal编程技术网

Assembly 程序集:最大数量:未正确比较

Assembly 程序集:最大数量:未正确比较,assembly,x86-16,Assembly,X86 16,当我运行我的程序时,它只显示最大值作为最后一个数字输入。它不会比较或保存在最后一个数字之前写入的其他数字。我研究把它做成一个数组,但是我的老师要求我插入数字,而不是已经给出了数字。用户应该给出数字,而不是程序员。所以我没有找到如何在数组中插入数字。这就是为什么我做了比较数字的原因。顺便说一下,这是8086组件。您的问题在这里: .MODEL SMALL .STACK 100h .data bigger db 0 mensaje db 0AH,0DH,'Finding the biggest nu

当我运行我的程序时,它只显示最大值作为最后一个数字输入。它不会比较或保存在最后一个数字之前写入的其他数字。我研究把它做成一个数组,但是我的老师要求我插入数字,而不是已经给出了数字。用户应该给出数字,而不是程序员。所以我没有找到如何在数组中插入数字。这就是为什么我做了比较数字的原因。顺便说一下,这是8086组件。

您的问题在这里:

.MODEL SMALL
.STACK 100h
.data
bigger db 0
mensaje db 0AH,0DH,'Finding the biggest number','$'
mensaje1 db 0AH,0DH,'Write 5 numbers to compare','$'
mensaje2 db 0AH,0DH,'Number: ','$'
resultadomayor db 10,13,'the biggest number is: ','$'
.code
start proc far 
    MOV AX,@DATA
    MOV DS,AX
    mov cx,5
    MOV DX,OFFSET MENSAJE
    MOV AH,09
    INT 21H
    MOV DX,OFFSET MENSAJE1
    MOV AH,09
    INT 21H
ciclo: call iniciociclo
 dec cx
jne ciclo
    call imprimirmayor

    MOV AH,4CH
    INT 21H  
start endp
;
bucle proc near

 MOV DX,OFFSET MENSAJE2
 MOV AH,09
 INT 21H
 MOV AH,01
 INT 21H
 cmp bigger,al
 jnb masgrande

 masgrande: 
 mov bigger,al
 ret
bucle endp
;
printbiggest proc near

MOV DX,OFFSET resultadomayor
MOV AH,09
INT 21H
mov dx,offset bigger
mov ah,09
int 21h
printbiggest endp
end start
该代码总是将值复制到变量
biger
,因为
jnb
指令不会导致跳过任何代码。按如下方式重新排列说明:

cmp bigger,al
jnb masgrande

masgrande: 
mov bigger,al

如前所述,您应该将行放在正确的位置,您的代码只是“飞越”了条件(尽量避免无意义的标签)。 还可以尝试使用JB而不是JNA

cmp bigger,al
jnb masgrande
mov bigger,al
masgrande: 

代码很难理解,因为您已经重命名了一些过程,但尚未更改调用它们的名称。您仍然需要更改define for biger,以便在printMax中正确显示数字。使用
biger db 0,“$”
。code start proc far MOV AX、@DATA MOV DS、AX MOV cx、5 MOV DX、OFFSET MENSAJE MOV AH、09 INT 21H MOV DX、OFFSET MENSAJE1 MOV AH、09 INT 21H ciclo:call iniciclo dec cx jne ciclo call printbiger MOV AH、4CH INT 21H start endp;靠近MOV DX的颊部加工,偏移量为2 MOV AH,09 INT 21H MOV AH,01 INT 21H cmp bigger,al jnb masgrande masgrande:MOV bigger,al ret bucle endp;在MOV DX附近打印最大的进程,偏移结果OMAYOR MOV AH,09 INT 21H MOV DX,偏移更大的MOV AH,09 INT 21H PRINT最大的endp end STARTHANKS我放入$,它打印得更好,但仍然只是最后插入的数字,而不是最大的。它仍然没有比较数字。我使用cmp更大,al是将保存的号码与新号码进行比较。如果新的数字更大,那么跳到“masgrande”,这是mov biger,al的标签。如果数字不大,它应该什么都不做。@VioletaLeón:跳转到改变变量的代码的问题是代码在跳转之后。如果它不跳转,它仍将继续跳转到代码中。如果您不想让它做任何事情,您需要一个非点式跳转或返回来防止它继续进入下面的代码。
cmp bigger,al
jnb masgrande
;missing
masgrande: 
mov bigger,al

CMP al, biggest
JB NOT_BIGGEST
MOV biggest, al
NOT BIGGEST:
;keep your program here