在阵列中找到第二个最小值的汇编程序

时间:2018-06-14 22:13:31

标签: arrays sorting assembly x86-16

这是我的代码,它应该以找到最小数字的方式对数组进行排序但是当我在8086程序集上运行时我没有看到任何结果或其他任何东西,但我猜问题是我的代码无法摆脱循环或类似的东西是正确的吗? 我再次说我的代码问题是它没有在窗口上显示任何结果,我的程序必须找到数组中的第二个最小数字。有人帮我修复它吗?

org 100h

; add your code here    
DATA SEGMENT
ARR DB 5,3,7,1,9,2,6,8,4
LEN DW $-ARR
SMALL DB ?
SECOND DB ?
DATA ENDS
CODE SEGMENT
ASSUME DS:DATA CS:CODE
START:
MOV AX,DATA
MOV DS,AX
LEA SI,ARR
MOV AL,ARR[SI]
MOV SMALL,AL
MOV CX,LEN
REPEAT1:
MOV AL,ARR[SI]
CMP SMALL,AL
JL NOCHANGE
MOV SMALL,AL
NOCHANGE:
INC SI
LOOP REPEAT1
LEA SI,ARR
MOV AL,ARR[SI]
MOV SECOND,AL
MOV CX,LEN
REPEAT2:
MOV AL,ARR[SI]
CMP SECOND,AL
JL SKIP
CMP SMALL,AL
JGE SKIP
MOV SECOND,AL
SKIP:
INC SI
LOOP REPEAT2
MOV AH,4CH
INT 21H
CODE ENDS
END START

ret

1 个答案:

答案 0 :(得分:0)

我想知道你班上的这一点是否应该能够输出数字,而不是在运行调试器时查看寄存器值。

作为替代方法,将注释行插入代码中以将值作为错误代码返回:

        LOOP    REPEAT2
        MOV     AH,4CH
        MOV     AL,SECOND     ;insert this line
        INT     21H
        CODE    ENDS
        END     START

组装并链接程序后,从DOS控制台窗口(命令提示符)运行它。假设你将它命名为#34; myprogram.com"。然后使用以下命令:

myprogram
echo %errorlevel%

当使用AH = 4CH和INT 21H时,errorlevel是AL中的值。这仅适用于单字节值,但这就是你在这种情况下所拥有的。

否则,您必须添加代码才能将值转换为十进制并输出结果。如果这些是数字值,则输出代码很简单:

        MOV     DL,SECOND
        ADD     DL,030H
        MOV     AH,002H
        INT     21H
        MOV     DL,00DH
        MOV     AH,002H
        INT     21H
        MOV     DL,00AH
        MOV     AH,002H
        INT     21H

或使用字符串:

SECOND  DB      ?
STRNG   DB      000H,00DH,00AH,'$'     ;insert this line
        ...
        MOV     AL,SECOND
        ADD     AL,30
        MOV     STRNG,AL
        MOV     DX,OFFSET STRNG
        MOV     AH,009H
        INT     21H