DATAS SEGMENT
NUM DW 1224H
DATAS ENDS
STACKS SEGMENT
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
MOV BX,NUM
MOV CH,16;计数器
JISUAN:
ROL BX,1
MOV AL,BL
AND AL,1
ADD AL,30H
MOV DL,AL
MOV AH,2
INT 21H
DEC CH
JNZ JISUAN
MOV AH,4CH
INT 21H
CODES ENDS
END START
数据段NUM十进制显示
DATAS SEGMENT
NUM DW 123H
DATAS ENDS
STACKS SEGMENT
TOS LABEL WORD
DW 20DUP(0)
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
MOV AX,STACKS
MOV SS,AX
MOV SP,OFFSET TOS
MOV AX,NUM
CWD
MOV CL,10
MOV CH,0;计数器
CHU:
DIV CL
PUSH AX ;保存商和余数
MOV AH,0
INC CH
CMP AL,0;商为0时,结束循环
JNZ CHU
QU:;出栈,输出
POP BX
MOV CL,BH
MOV DL,CL
ADD DL,30H
MOV AH,2
INT 21H
DEC CH
JNZ QU
MOV AH,4CH
INT 21H
CODES ENDS
END START
比较字符串,输出不同的字母
DATAS SEGMENT
NUM DW 1234H
STRING1 DB 'MATDFEY'
STRING2 DB 'NOMCTEH'
DATAS ENDS
STACKS SEGMENT
TOS LABEL WORD
DW 20DUP(0)
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
MOV ES,AX
LEA SI,STRING1
LEA DI,STRING2 ;比较前操作
CLD ;DF=0,向后进行
MOV CX,7
REPNZ CMPSB ;不相等重复比较操作
MOV DL,CL ;剩余还未比较的字符
ADD DL,30H
MOV AH,2
INT 21H
MOV DL,0AH ;换行
INT 21H
MOV DI,6
SUB DI,CX
MOV DL,STRING1[DI];控制访问数据段位置
INT 21H
MOV AH,4CH
INT 21H
CODES ENDS
END START
每隔十秒响铃并输出
;编写一个中断处理程序,要求在主程序运行期间,
; 每隔 10秒响铃一次,同时显示‘The bell is ring!’
datasg segment
count dw 1
mess db 'The bell is ring!',0ah,0dh,'$'
datasg ends
codesg segment
main proc far
assume cs:codesg,ds:datasg,es:datasg
start:
push ds
xor ax,ax
push ax
mov ax,datasg
mov ds,ax
mov es,ax
mov al,1ch ;中断号
mov ah,35h
int21h ;取原中断向量
push es
push bx ;存放在es:bx中,保存原中断向量
push ds ;保护数据段
mov dx,offset ring
mov ax,seg ring
mov ds,ax ;设置新的中断向量 ds:dx
mov al,1ch
mov ah,25h
int21h
pop ds ;设置完取出数据段
;--------存取中断向量1------------
in al,21h ;21h中断屏蔽寄存器
and al,11111110b
out 21h,al ;设置中断屏蔽位,允许定时器中断
sti ;开中断
mov di,2000
delay:
mov si,30000
delay1:
dec si
jnz delay1
dec di
jnz delay
;--------存取中断向量2-------------
pop dx
pop ds
mov al,1ch
mov ah,25h
int21h
ret
main endp
;----------------------------------
ring proc far ;响铃子程序
push ds
push ax
push cx
push dx ;入栈保存
mov ax,datasg
mov ds,ax
sti ;开中断,允许更高级的中断
dec count
jnz exit
mov dx,offset mess ;显示The bell is ring
mov ah,09int21h
mov dx,100
in al,61h
and al,11111100b
sound:
xor al,2
out 61h,al
mov cx,140h
wait1:
loop wait1
dec dx
jne sound ;响铃
mov count,182
exit:
cli ;关中断
pop dx
pop cx
pop ax
pop ds
iret
ring endp
;-----------------------------------
codesg ends
end main
递归与非递归求累加和
DATAS SEGMENT
RESULT DB 10DUP(0)
CJ_2 DB 'DIGUI: $'
DATAS ENDS
STACKS SEGMENT
DB 10DUP(0)
TOS LABEL WORD
STACKS ENDS
CODES SEGMENT
MAIN PROC FAR
ASSUME CS:CODES,DS:DATAS,SS:STACKS
MOV AX,DATAS
MOV DS,AX
MOV AX,STACKS
MOV SS,AX
MOV SP,OFFSET TOS
CALL CJ1
CALL HUAN
CALL CJ2_
CALL CJ2
CALL HUAN
CALL CJ2_DAYIN
CALL HUAN
MOV AH,4CH
INT 21H
MAIN ENDP
;---------------------------
CJ1 PROC NEAR
MOV AH,1
INT 21H
SUB AL,30H
MOV CL,0;每次加的数字
MOV CH,0;总和
MOV DH,0;计数器
JIAHE:
INC CL
ADD CH,CL
CMP CL,AL;al 为输入的 num
JNZ JIAHE
MOV [RESULT],CH
MOV AL,CH
XOR AH,AH
CHU:
MOV BH,10
DIV BH
PUSH AX
INC DH;结果入栈的计数器
MOV AH,0;ah 为余数,已经进栈保存
CMP AL,0;商为 0 时,除法结束
JNE CHU
MOV DL,10
MOV AH,2
INT 21H
QU:
POP BX
DEC DH
MOV DL,BH
ADD DL,30H
MOV AH,2
INT 21H
CMP DH,0
JNE QU
RET
CJ1 ENDP
;--------------------------------
CJ2_ PROC NEAR
MOV AH,09H
LEA DX,CJ_2
INT 21H
XOR DX,DX
MOV AH,2
MOV DL,10
INT 21H
MOV AH,1
INT 21H
SUB AL,30H
MOV CL,AL
MOV CH,0
RET
CJ2_ ENDP
;---------------------------------
CJ2 PROC NEAR
CMP CL,0
JZ L2
ADD CH,CL
DEC CL
CALL CJ2;此处为递归
L2:
RET
CJ2 ENDP
;---------------------------------
CJ2_DAYIN PROC NEAR
MOV AL,CH
MOV AH,0
MOV CL,0
CHU2:
MOV BL,10
DIV BL
PUSH AX
MOV AH,0
INC CL
CMP AL,0
JNE CHU2
QU:
POP BX
MOV DL,BH
ADD DL,30H
MOV AH,2
INT 21H
DEC CL
CMP CL,0
JNE QU
RET
CJ2_DAYIN ENDP
;-----------------------------
HUAN PROC NEAR
MOV DL,10
MOV AH,2
INT 21H
RET
HUAN ENDP
;-------------------------
CODES ENDS
END MAIN