第一个大题参考代码
DATA SEGMENT
; 定义一个名为 ARR 的字节数组,包含20个有符号整数
ARR DB 1, -2, 3, 4, -5, 6, -7, 8, -9, 10
DB -11, -12, 13, -14, 15, -16, 17, -18, 19, -20
; 定义一个名为 ArrayP 的字节数组,用于存放正数,预留20个字节的空间
ArrayP DB 20 DUP(?)
; 定义一个名为 ArrayN 的字节数组,用于存放负数,预留20个字节的空间
ArrayN DB 20 DUP(?)
CNT EQU 20
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE, DS:DATA
START:
; --- 初始化段寄存器 ---
MOV AX, DATA ; 将数据段的地址放入 AX
MOV DS, AX ; 设置数据段寄存器 (DS)
; --- 初始化指针和计数器 ---
MOV BX, OFFSET ARR ; 将 ARR 的偏移地址(起始地址)放入 BX,作为源操作数指针
MOV SI, OFFSET ArrayP ; 将 ArrayP 的偏移地址(起始地址)放入 SI,作为目的指针
MOV DI, OFFSET ArrayN ; 将 ArrayN 的偏移地址(起始地址)放入 DI,作为目的指针
MOV CX, CNT ; 将循环次数设置为 20,因为数组有20个元素
LOP:
; --- 循环体 ---
MOV AL, [BX] ; 从源数组 ARR(BX指向的位置)取一个字节到 AL 寄存器
CMP AL, 0 ; 比较 AL 中的数值和 0
JLE BELOW ; 如果 AL 小于或等于 0 (Jump if Less or Equal),则跳转到 BELOW 标签
; --- 如果是正数 ---
MOV [SI], AL ; 将 AL 中的正数存入目标数组 ArrayP(SI指向的位置)
INC SI ; 将目的指针 SI 向后移动一个字节,为下一个负数做准备
JMP COMMON ;跳到共同的递增部分
BELOW:
MOV [DI],AL
INC DI
; --- 无论正负,都执行 ---
COMMON:
INC BX
LOOP LOP
EXIT:
; --- 输出两个数组中数据的个数 ---
SUB SI,OFFSET ArrayP
MOV DL,SI
ADD DL,30H ;加上'0'的ASCI码
MOV AX,0200H ;功能号02,用于输出单个字符不用MOV AH,02是因为AL前面存了值,需要覆盖为0
INT 21H
SUB DI,OFFSET ArrayN
MOV DL,DI
ADD DL,30H ;加上'0'的ASCI码
MOV AX,0200H
INT 21H
; --- 程序结束 ---
MOV AH, 4CH ; DOS 功能调用,准备退出程序
INT 21H ; 执行中断,返回操作系统
CODE ENDS
END START ; 指定程序入口点为 START