|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
;功能:从屏幕第一行开始显示1-n的自然数串中的所有的质数,并用空格隔开;n<10000h,n的上下限用bx设置。
assume cs:code
data segment
db 16 dup (0)
data ends
code segment
start: mov ax,data ;获取数据段段地址
mov ds,ax ;把数据段地址送入数据段寄存器
mov ax,0b800h ;将显示缓冲区段地址送入通用寄存器
mov es,ax ;从通用寄存器将显示缓冲区段地址传入附加段寄存器
mov di,0 ;初始化显示缓冲区偏移地址,用于数字加空格的连续输入
mov bx,1 ;初始化变量的下限值
cmp bx,1 ;将变量和1比较大小
je s4 ;等于1跳转到非质数的处理段s4
s3: mov si,0 ;初始化一个标记,里面用来装被整除的次数
mov cx,bx ;将变量传入放除数的寄存器
s6: dec cx ;将除数减1作为除数
mov ax,bx ;将变量作为被除数
mov dx,0 ;将放余数的寄存器清零
div cx ;做16位除法
cmp dx,0 ;将结果的余数和零比较
jne s6 ;不等于0则跳转到s6,即把除数减1继续做除法,直到除数等于1为止
inc si ;如果余数等于0,将标记加1
cmp si,2 ;将标记中的数和2比较
je s4 ;如果等于2,表示被除数是质数,跳转到非质数的处理段s4
cmp cx,1 ;将除数与1比较
je s5 ;如果等于1跳转到判断标记段s5
jmp short s6 ;如果不等于1,跳转到将除数减1继续做除法的段s6
s5: cmp si,1 ;将标记中的数和1比较
jne s4 ;不等于1表述被除数不是质数,跳转到非质数的处理段s4
mov ax,bx ;将变量作为被除数
mov si,0 ;将记录余数个数的标记清零
s: mov cx,10 ;将除数设为10
mov dx,0 ;将放余数的寄存器清零
div cx ;做除法
add dx,30h ;将余数加30h得到ASCII码
push dx ;将ASCII码入栈
inc si ;计数器加1
cmp ax,0 ;将商和0比较
jnz s ;不等于0,则跳转到s继续用10除
mov cx,si ;将上面的标记中的数传入计数器
mov si,0 ;将目标地址的偏移地址初始化为0
s7: pop ax ;将ASCII码出栈
mov ds:[si],al ;将ASCII码送入数据段
inc si ;数据段偏移地址加1
loop s7 ;循环之前计数器中的次数
mov cx,si ;si中的数表示有几个ASCII码进入数据段,可以作为循环次数
mov si,0 ;将数据地址的偏移地址初始化为0
mov ah,2 ;将颜色属性放入通用寄存器的高8位
s1: mov al,[si] ;将数据段中的ASCII码传入通用寄存器的低8位
mov es:[di+160],ax ;将颜色属性和ASCII码一次性传入显示缓冲区
add di,2 ;将显示缓冲区偏移地址加2
inc si ;将数据段偏移地址加1
loop s1 ;循环之前计数器中的次数
mov cx,8 ;将计数器设为8
sub cx,si ;用8减去si中的数,表示要补多少个空格
mov ax,0 ;将颜色属性0和空格的ASCII码一次性送入通用寄存器
s2: mov es:[di+160],ax ;将颜色属性0和空格的ASCII码一次性送入显示缓冲区
add di,2 ;显示缓冲区偏移地址加2
loop s2 ;循环之前计数器中的次数
s4: inc bx ;变量加1
cmp bx,1500 ;用变量和上限值比较
jna s3 ;不大于则跳转到s3处继续执行
mov ax,4c00h ;设置中断号
int 21h ;进行21中断
code ends
end start
|
|