MY_STACK SEGMENT PARA STACK
STACK_AREA DW 100H DUP(?)
STACK_BTM EQU $ - STACK_AREA
MY_STACK ENDS
MY_DATA SEGMENT
TABLE_LEN DW 16
TABLE DW 200,300,400,10,20,0,1,8
DW 41H,40,42H,50,60,0FFFFH,2,3
MY_DATA ENDS
MY_CODE SEGMENT
ASSUME CS:MY_CODE,DS:MY_DATA,SS:MY_STACK
MAIN PROC FAR ;sort(task1)
MOV AX,MY_STACK
MOV SS,AX
MOV AX,MY_DATA
MOV DS,AX
MOV SP,STACK_BTM
LOOP1: MOV BX,1
MOV CX,TABLE_LEN
DEC CX
MOV SI,OFFSET TABLE
LOOP2: MOV AX,[SI]
CMP AX,[SI+2]
JA CONTINUE
XCHG AX,[SI+2]
MOV [SI],AX ;change two numbers in memory
MOV BX,0
CONTINUE: ADD SI,2
LOOP LOOP2
CMP BX,1
JZ TURN_TO_HEX
JMP SHORT LOOP1
TURN_TO_HEX: ;print the array in hex(task2)
MOV CX,TABLE_LEN
MOV BX,0
LOOP3: MOV SI,OFFSET TABLE
ADD SI,BX
MOV AX,[SI]
MOV SI,0
MOV DI,0010H
LOOP4: MOV DX,0
DIV DI
CMP DX,10
JAE BRANCH1
ADD DX,30H
JMP BRANCH2
BRANCH1: ADD DX,57H
BRANCH2: PUSH DX
INC SI
CMP AX,0
JNZ LOOP4
LOOP5: POP DX
MOV AH,2
INT 21H
DEC SI
CMP SI,0
JNZ LOOP5
MOV DL,32
MOV AH,2
INT 21H
ADD BX,2
LOOP LOOP3
JMP EXIT
TURN_TO_DEC: ;print the array in dec(task3)
MOV CX,TABLE_LEN
MOV BX,0
LOOP6: MOV SI,OFFSET TABLE
ADD SI,BX
MOV AX,[SI]
MOV SI,0
MOV DI,000AH
LOOP7: MOV DX,0
DIV DI
ADD DX,30H
PUSH DX
INC SI
CMP AX,0
JNZ LOOP7
LOOP8: POP DX
MOV AH,2
INT 21H
DEC SI
CMP SI,0
JNZ LOOP8
MOV DL,32
MOV AH,2
INT 21H
ADD BX,2
LOOP LOOP6
JMP EXIT
EXIT: MOV AX,4C00H
INT 21H
MAIN ENDP
MY_CODE ENDS
END MAIN
程序实现的效果如下图(在DOSBOX中编译并运行):
十六进制输出结果
十进制输出结果
DATA SEGMENT
X DD 0FFFFFFFFH
Y DD 0FFFFFFFFH;申请两个双字,作为乘法所需的两个乘数
RESULT DW 0,0,0,0 ;申请四个字的空间,存放结果
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
MAIN PROC FAR
MOV AX,DATA
MOV DS,AX
MOV BX,WORD PTR Y
MOV AX,WORD PTR X;先将两个乘数的低位进行乘法
MUL BX
MOV RESULT,AX
MOV RESULT+2,DX
MOV BX,WORD PTR Y
MOV AX,WORD PTR X+2;之后两步,是分别用一个数的高位乘另一个的低位
MUL BX
ADD RESULT+2,AX
ADC RESULT+4,DX
ADC RESULT+6,0
MOV BX,WORD PTR Y+2
MOV AX,WORD PTR X
MUL BX
ADD RESULT+2,AX
ADC RESULT+4,DX
ADC RESULT+6,0
MOV BX,WORD PTR Y+2
MOV AX,WORD PTR X+2;最后将高位相乘
MUL BX
ADD RESULT+4,AX
ADC RESULT+6,DX
MOV AX,4C00H;退出
INT 21H
MAIN ENDP
CODE ENDS
END MAIN
程序实现的效果如下图(在DOSBOX中编译并运行):