1.试编写完整的汇编语言源程序,对任意给定的十个无符号数按由大到小排序,并把排序结果在显示器上显示。

2025-01-07 00:40:16
推荐回答(2个)
回答1:

.MODEL SMALL
.STACK 200H

.DATA
NUM1 DW 123, 12666, 1, 8, 3, 38, 28, 83, 178, 12

.CODE
START:
MOV AX, @DATA
MOV DS, AX

LEA SI, NUM1
MOV DI, 506H ;显示屏的偏移地址
MOV CX, 10 ;数据段的10个数据
CALL DISP

LEA SI, NUM1
MOV CX, 10 ;数据段的10个数据
CALL SORT

LEA SI, NUM1
MOV DI, 646H ;显示屏的偏移地址
MOV CX, 10 ;数据段的10个数据
CALL DISP

MOV AX, 4C00H
INT 21H
;-----------------------------------
SORT:
DEC CX
S0: PUSH CX
MOV DI, SI
S1: MOV AX, [DI]
CMP AX, [DI + 2]
JB S2
XCHG AX, [DI + 2]
MOV [DI], AX
S2: ADD DI, 2
LOOP S1
POP CX
LOOP S0
RET
;-----------------------------------
DISP:
PUSH CX
CALL DTOC ;调用函数,在显示屏显示
ADD SI, 2
ADD DI, 2 ;指向下一个显示位置
POP CX
LOOP DISP
RET
;-----------------------------------
DTOC:
MOV AX, [SI]
MOV BX, 10
MOV CX, 0
D_LOOP1:
SUB DX, DX ;DX清零
DIV BX
PUSH DX
INC CX
CMP AX, 0
JNZ D_LOOP1
MOV AH, 2
D_LOOP2:
POP DX
CALL SHOW_STR ;调用显示子程序
LOOP D_LOOP2
RET
;-----------------------------------
SHOW_STR: ;显示
MOV BX, 0B800H
MOV ES, BX
ADD DX, 4A30H ;化为ASCII码
MOV ES:[DI], DX
ADD DI, 2 ;指向下一个显示位置
RET
;-----------------------------------
END START

本程序使用了简化的段定义结构,子程序设计方法。

回答2:

DATA SEGMENT
X DW 3,7,0,6,0,1,0,8
X_LEN DW 8
DATA ENDS

STACK SEGMENT STACK
DW 200 DUP(?)
STACK ENDS

CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK
START:
MOV AX,DATA
MOV DS,AX
MOV CX,X_LEN

DEC CX
lp0:push cx
mov cx,7
LEA SI,X
LP1: MOV AX,[SI]
CMP AX,[SI+2]
JBE LP2
XCHG AX,[SI+2]
MOV [SI],AX
LP2: ADD SI,2
LOOP LP1

pop cx
loop lp0

MOV CX,X_LEN
LEA BX,X
LP3: MOV DL,[BX]
OR DL,30H
MOV AH,2
INT 21H
ADD BX,2
LOOP LP3

MOV AX,4C00H
INT 21H
CODE ENDS
END START