📄 4123.asm
字号:
;4-1,2,3
;把地址偏移量为100H单元开始的256个单元分别写入00H,01H,...,FFH数据,
;并统计0、正数、负数的个数,把统计结果送入上述数据块之后的3个单元中,
;用DOS功能调用显示数据块各单元内容。
DATA SEGMENT
ORG 100H ;数据块在段中的偏移地址为100H
BUF1 DB 256 DUP(?) ;buf1的256个单元存放数据
COUNT EQU $-BUF1 ;数据块长度为256
BUF2 DB 3 DUP (?) ;BUF2的3个单元存放统计结果
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START: MOV AX,DATA
MOV DS,AX
LEA SI,BUF1 ;si指向buf1的首地址
MOV CX,COUNT ;数据块的长度为256
XOR AL,AL ;al清零
XOR BX,BX ;bx清零
XOR DH,DH ;dh清零
NEXT1: MOV [SI],AL ;将AL的数据(00H~FFH)存入SI所指向的内存单元中
MOV AH,[SI]
CMP AH,0
JZ ZERO ;若ZF=1,则该数为0,转至zero,DH加1
JS NEGATIVE ;若SF=1,则该数为负数,则转至NEGATIVE,BH加1
INC BL ;若SF=0,则该数为正数,则BL加1,即正数的个数加1
JMP NEXT2
ZERO: INC DH ;0的个数加1
JMP NEXT2
NEGATIVE: INC BH ;负数的个数加1
JMP NEXT2
NEXT2: INC AL ;al加1
INC SI ;si指向下一单元
LOOP NEXT1
MOV [SI],DH ;在数据块后存入0的总个数
INC SI
MOV [SI],BL ;在0的总个数后存入正数的总个数
INC SI
MOV [SI],BH ;在正数的总个数后存入负数的总个数
LEA SI,BUF1
MOV CX,COUNT+3 ;数据块的长度是259
LINE: MOV BH,16 ;每输出16个数回车换行
NEXT3: MOV AL,[SI]
MOV BL,AL
SHR AL,1 ;将al中存的值逻辑左移4,则al中的值是bl的高四位
SHR AL,1
SHR AL,1
SHR AL,1
CALL EXCHANGE ;将al中的值转换为ASCII码
MOV AL,BL
AND AL,0FH ;al中的值是bl的低四位
CALL EXCHANGE ;将其转换为ASCII码
MOV AL,20H ;输出空格
CALL SHOW
INC SI ;si指向下一单元
LOOP NEXT4
JMP STOP
NEXT4: DEC BH ;bh减1
JNZ NEXT3
MOV AL,0DH ;回车
CALL SHOW
MOV AL,0AH ;换行
CALL SHOW
JMP LINE
EXCHANGE PROC NEAR ;将al中的值转换为ASCII码
CMP AL,0AH
JS DONE
ADD AL,7
DONE: ADD AL,30H
MOV DL,AL
MOV AH,02H
INT 21H
RET
EXCHANGE ENDP
SHOW PROC NEAR ;显示
MOV DL,AL
MOV AH,02H
INT 21H
RET
SHOW ENDP
STOP: MOV AH,4CH ;结束
INT 21H
CODE ENDS
END START
;子程序清单:
;子程序名:EXCHANGE
;功能:将一个字节的十六进制数的低四位转换成ASCII码并显示
;所用寄存器:al,dl,ah
;入口参数:al存放一个字节(十六进制数的低四位)
;出口参数:无
;子程序名:SHOW
;功能:显示ASCII代码
;所用寄存器:al,dl,ah
;入口参数:al存放一个ASCII代码
;出口参数:无
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -