数据段定义:
datarea segment
定义缓冲区接收用户输入的查找范围字符串
buf db 10
db ?
db 10 dup(?)
定义输入是否有非数字字符标志
just db 1
用以权值的增加或减少
factor dw 10
输入数字的每一位的权值
mulfactordw 1
str db 13,10,'Please input a number between 1~~10000:',13,10,'$'
str_alarm db 13,10,'Please select an item ! 0:exit, 1:start',13,10,'$'
str_err db 13,10,'Please input number charaters !',13,10,'$'
datarea ends
--------------------------------------------------------
code segment
----------------------------------------------------------
assume cs:code,ds:datarea
start:
---------------------------------------
push ds
push ax
---------------------------------------
把数据段首地址赋予ds
mov ax,datarea
mov ds,ax
---------------------------------------
主程序main
main proc far
p1:
要求用户选择进入查找还是推出
lea dx,str_alarm
mov ah,9
int 21h
接收用户的选择
mov ah,01
int 21h
判断用户是否输入正确的选项
cmp al,'0'
je p3
cmp al,'1'
jne p1
调用check子程序,将用户输入字符串转化为数字
callcheck
判断用户的输入是否都是数字字符
cmp just,0
je p2
调用outputNumList子程序,查找并输出相应的素数列表
calloutputNumList
jmp p1
输出提示输入数字字符
p2:
lea dx,str_err
mov ah,09h
int 21h
jmp p1
p3: ret
pop ax
pop ds
mov ax,004ch
int 21h
main endp
---------------------------------------
子程序check
check proc
初始化
mov bx,0
mov mulfactor,1
mov factor,0ah
输出提示用户输入要查询素数的范围
lea dx,str
mov ah,09h
int 21h
接收用户的输入,保存于缓冲区
lea dx,buf
mov ah,0ah
int 21h
----------------------------------------
将输入的字符的个数保存于si,用于计数
mov al,buf[1]
cbw
mov si,ax
Sum:
取第si+1个字符,判断它是否为数字字符
mov al,buf[si+1]
cmp al,'0'
jbg1
cmp al,'9'
jag1
and ax,000fh
将此位数字乘以相应的权值并加到bx
mul mulfactor
add bx,ax
将权值乘以10
mov ax,mulfactor
mul factor
mov mulfactor,ax
call fib
dec si
jnz Sum
置是否包含字符标志位
mov just,1
jmp g2
g1:mov just,0
g2:
ret
check endp
-------------------------------------
子程序outputNumList
outputNumList proc
把mulfactor初始化为输入数值的最高位权值
因在check子程序中,mulfactor多乘了一次10
mov ax,mulfactor
cwd
div factor
mov mulfactor,ax
CX←输入的数值
mov cx,bx
mov si,1h
恢复ax的值
recoverAx:mov ax,si
检查下一个数值
next: inc ax
cmp ax,cx
ja Exit
除数应该从2开始
mov bx,2h
判断一个数是否能被比它小的数整除
text: cmp bx,ax
jnb continue
mov si,ax
cwd
div bx
cmp dx,0000H
je recoverAx
inc bx
mov ax,si
jmp text
打印当前素数
continue:
mov bx,ax
and dx,0h
mov di,mulfactor
l1: div di
add ax,30h
mov si,dx save remain
mov dl,al
mov ah,2h
int 21h
mov ax,di
cwd
div factor
mov di,ax
mov ax,si
cwd
cmp di,0h
jne l1
输出一个空格
mov dl,20h
mov ah,2h
int 21h
mov ax,bx
cmp ax,cx
jb next
Exit: ret
outputNumList endp
FIBPROC NEAR递归子程序
PUSH AX
PUSH BP
MOV BP,SP
MOV AX,[BP+6]
CMP AX,2
JE DONE
CMP AX,1
JE EXIT
FIB1:
DEC AX
PUSH AX
CALL FIB调用递归子程序
POP AX
MOV AX,[BP-6] 将前两项相加
ADD AX,[BP-14]
MOV [BP+2],AX
JMP EXIT
DONE:
MOV AX,1
MOV [BP+2],AX
PUSH AX
CALL FIB调用递归子程序
POP AX
EXIT:
POP BP
POP AX
RET
FIBENDP
DISDEC PROC NEAR 将16进制转化为10进制的子程序
MOV AX,DI
MOV CX,10000D
CALL DIVDEC
MOV CX,1000D
CALL DIVDEC
MOV CX,100D
CALL DIVDEC
MOV CX,10D
CALL DIVDEC
MOV CX,1D
CALL DIVDEC
MOV BX,0
MOV SWAPPER,BX
RET
DISDEC ENDP
DIVDEC PROC NEAR
MOV DX,0
DIV CX
PUSH DX
CMP AL,0
JZ CMPSWP
JMP DISOK
CMPSWP:
MOV BX,[SWAPPER]
CMP BX,0
JZ EXIT1
DISOK:
ADD AL,30H
MOV DL,AL
MOV AH,02
INT 21H
MOV BX,1
MOV [SWAPPER],BX
EXIT1:
POP DX
MOV AX,DX
RET
DIVDEC ENDP
-------------------------------------
code ends
end start
程序段代码:MOV AL,80H80H是8255的控制字
MOV DX,010EH010EH是8255的控制端口的地址具体的根据你的电路连接的方法计算出来替换就可以了
OUT DX,AL
MOV BX,8
MOV XC,8
A2:
MOV AL,01H
MOV DX,010AH010AH是8255的A口或者B口的地址 根据你的图而定
A1:
OUT DX,AL
CALL DEKAY
SHL AL,1
LOOP A1
DEC BX
JNZ A2
DELAY PROC NEAR
PUSH CX
MOV CX,0FFFFH修改0FFFFH的值可以改变跑马灯的时间间隔
LOOP $
POP CX
RET
DELAY ENDP
HLT
上面的程序是一个跑马灯的程序 跑马灯效果是D0--D7一次点亮 循环八次的一个程序
希望采纳
CODE SEGMENT代码段开始ASSUME CS:CODE 代码段地址和CS段寄存器关联
START:MOV AL,0ABH START是一个标签, 将 *** 作数0ABH 放在寄存器AL中
MOV CL,4 将4放在寄存器CL中
ROL AL,CL 将AL中的数循环左移4位 左移的位数时根据cl的值来决定
MOV AX,4C00H 21号中断的4c号功能用于退出程序返回执行权给 *** 作系统
INT 21H调用中断21h, 退出程序 不写这个你的程序运行后dos就会死住无法继续 *** 作
CODE ENDS
END START
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)