當前位置:編程學習大全網 - 源碼下載 - 急求壹個匯編語言的源代碼!!!

急求壹個匯編語言的源代碼!!!

; 題目名稱:求100 以內的素數

; 題目來源:/question/129790890.html

;

參考資料:

/view/1767.htm

; 本程序在MASMPlus 1.2集成環境下通過編譯,經過調試,運行正確。

Code Segment

Assume CS:Code,DS:Code

; -------------------------------------

; 功能:顯示指定地址(Str_Addr)的字符串

; 入口:

; Str_Addr=字符串地址(要求在數據段)

; 用法: Output Str_Addr

; 用法舉例:Output PromptStr

Output MACRO Str_Addr

push ax

lea dx,Str_Addr

mov ah,9

int 21h

pop ax

EndM

; -------------------------------------

; 功能:輸出壹個字符

; 入口:dl=要顯示的字符

Output_Chr proc Near

push ax

mov ah,02h

int 21h

pop ax

ret

Output_Chr endp

; -------------------------------------

; 功能:輸出回車換行

Output_CTLF proc Near

push ax

push dx

mov ah,02h

mov dl,0dh

int 21h

mov dl,0ah

int 21h

pop dx

pop ax

ret

Output_CTLF endp

; -------------------------------------

; 功能:把AX中的二進制無符號數轉換成顯式的十進制ASCII碼,並送顯示屏顯示

; 入口:AX=二進制數

; 出口:在當前光標位置顯示轉換後的ASCII碼數字

Dec_ASCII Proc Near

push dx

push bx

push di

mov bx,10

lea di,@@Temp_Save[6]

mov BYTE ptr [di],'$'

dec di

@@Divide: xor dx,dx

div bx

or dl,30h

mov [di],dl

dec di

test ax,0ffffh

jnz @@Divide

inc di

push di

pop dx

mov ah,9

int 21h

pop di

pop bx

pop dx

ret

@@Temp_Save db 7 dup(?)

Dec_ASCII EndP

; -------------------------------------

; 功能:延時指定的時鐘嘀嗒數

; 入口:

; Didas=時鐘嘀嗒數(1秒鐘約嘀嗒18.2次,10秒鐘嘀嗒182次。若延時不是秒的10數次倍,誤差稍微大點)

Delay Proc Near

push dx

push cx

xor ax,ax

int 1ah

mov cs:@@Times,dx

mov cs:@@Times[2],cx

Read_Time: xor ax,ax

int 1ah

sub dx,cs:@@Times

sbb cx,cs:@@Times[2]

cmp dx,Didas

jb Read_Time

pop cx

pop dx

ret

@@Times dw 0,0

Delay EndP

; -------------------------------------

; 判斷素數

; 入口參數:AL=256以內無符號整數

; 返回參數:若AL是素數,進位標誌置位;否則,清位

Estimation Proc Near

push si

push cx

push ax

lea si,PrimeLess

cmp al,1

jz @@Not_Prime ;1不是素數

mov cx,4

@@Less_Prime: cmp al,[si]

jz @@Yes_Prime ;2、3、5、7是素數

inc si

loop @@Less_Prime

test al,1

jz @@Not_Prime ;除了2,其它偶數不是素數

lea si,PrimeLess[1]

mov cx,3

@@Divide357: push ax

div BYTE ptr [si]

test ah,ah

jnz $+5

pop ax

jmp @@Not_Prime

pop ax

inc si

loop @@Divide357

jmp $+5

@@Not_Prime: clc ;不是素數,清進位標誌

jmp $+3

@@Yes_Prime: stc ;是素數,置進位標誌

pop ax

pop cx

pop si

ret

PrimeLess db 2,3,5,7

Estimation EndP

; -------------------------------------

prompt_1 db 'These primes are:',13,10,'$'

prompt_2 db 13,10,13,10,'The primes: $'

prompt_3 db 13,10,13,10,'The sum of the primes: $'

Press_Key db 13,10,13,10,'The complated. Press any key to exit...$'

Start: push cs

pop ds ;使數據段與代碼段同段

push cs

pop es ;使附加段與代碼段同段

Didas = 36 ;延時2秒

; -------------------------------------

;(1)以十進制輸出這些素數,每行10個,每輸出壹個素數都要有數秒的停頓

Output prompt_1 ;提示顯示素數

mov cx,99

xor bx,bx ;素數個數計數器

xor bp,bp ;素數之和初值

cld

PrimeSum: mov ax,100

sub ax,cx ;100以內的自然數

call Estimation ;判斷素數子程序

jnc Next_One ;不是素數

inc bx ;素數計數

add bp,ax ;累加素數

call Dec_ASCII ;把AX中的二進制無符號數轉換成顯式的十進制ASCII碼,並送顯示屏顯示

; call Delay ;延時2秒

mov dl,20h ;空壹格

call Output_Chr ;顯示輸出壹個字符

mov ax,bx

mov dl,10

div dl

test ah,ah

jnz $+5

call Output_CTLF ;顯示輸出壹個回車、換行

Next_One: loop PrimeSum

; -------------------------------------

;(2)以十進制形式輸出素數的個數

Output prompt_2 ;提示顯示素數個數

mov ax,bx

call Dec_ASCII

; -------------------------------------

;(3)以十進制形式輸出素數之和,並讓該和閃爍3 次。

Output prompt_3 ;提示顯示素數之和

xor bx,bx

mov ah,3 ;取光標位置

int 10h

mov ax,160

mul dh

shl dl,1

xor dh,dh

add ax,dx

inc ax

mov di,ax ;字符顯示方式當前光標位置顯示屬性在顯示緩沖區中的偏移地址

mov ax,bp

call Dec_ASCII

push es

mov ax,0b800h ;字符顯示方式屏幕顯示緩沖區段地址

mov es,ax

mov al,8dh ;字符顯示屬性

mov cx,4

cld

push di

Change_Attr1: stosb

inc di

loop Change_Attr1

Didas = 48 ;延時3秒

call Delay ;延時

pop di

mov al,7 ;字符顯示屬性

mov cx,4

Change_Attr2: stosb

inc di

loop Change_Attr2

pop es

; -------------------------------------

Exit_Proc: Output Press_Key ;提示操作完成,按任意鍵結束程序

mov ah,1

int 21h

mov ah,4ch ;結束程序

int 21h

Code ENDS

END Start ;編譯到此結束

  • 上一篇:釣魚遊戲源代碼c
  • 下一篇:社區團購系統怎麽做?
  • copyright 2024編程學習大全網