求一道8086汇编程序

求一道8086汇编程序,第1张

-------------------------------

数据段定义:

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


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11639019.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-17
下一篇 2023-05-17

发表评论

登录后才能评论

评论列表(0条)

保存