發(fā)現(xiàn)對匯編還是非常的生疏,可能平時(shí)程序?qū)懮倭税桑绕涫菍δ切┘拇嫫骺梢蚤g接尋址記的不牢,BIOS調(diào)用什么基本是現(xiàn)學(xué)現(xiàn)賣。
原來這個(gè)BIOS調(diào)用比DOS調(diào)用還要底層,連輸出字符串的功能都沒有,輸入字符串要要用鍵盤中斷,顯示漢字要用字模,所謂字模就是一個(gè)點(diǎn)陣,用整數(shù)表示,用位運(yùn)算去判斷是否在此處輸出點(diǎn),很傻×的方法。為了能夠快速移植(--!)把所有的功能都封裝成了函數(shù),在輕松匯編下面能夠成功運(yùn)行。因?yàn)楹苌儆脜R編寫程序,如果程序?qū)懙帽容^菜,還請大家多多指點(diǎn)。
程序以菜單形式實(shí)現(xiàn)4個(gè)功能:
1.顯示自己的英文名字和學(xué)號,并要求輸入學(xué)號,如果匹配,啟動windows,否則重新輸入,直到正確為止.
2.顯示中文名字,其他和1一致。
3.用像素繪一個(gè)圖
4.用菜單實(shí)現(xiàn)所有功能,并實(shí)現(xiàn)一個(gè)創(chuàng)新功能。
額,這個(gè)創(chuàng)新功能實(shí)在是沒什么想法,就隨便輸出幾句電影的經(jīng)典臺詞,就當(dāng)娛樂一下吧:-P
注意:BIOS不能使用DOS中斷,而且所有的數(shù)據(jù)必須處于代碼段中。
PS:老師竟然說我的程序是抄襲的,給了個(gè)三分。。。。無語。。。。
;//Bios
;//2010.8.27.
;//coded by abilitytao

.MODEL TINY,C
.386P
.DATA
.CODE
.STACK


;/**///////////////The code following can not be modified////////////////////////
START:
DB 0100H DUP(00H)
ORG 0000H
DB 55H,0AAH
DB 40H
JMP MAIN_ENTRY
ORG 0018H
DB 1CH,00H,00H,00H
DB 50H,43H,49H,52H
DW 4348H,5031H,0000H,0018H,0000H,0180H,0040H,0000H
DW 8000H,0000H,0000H,0FFFFH,0000H,0003H
ORG 0100H
MAIN_ENTRY:
NOP
PUSH DX
PUSH BX
PUSH AX
CALL SHOW_MAIN ;THIS FUNCTION IS WHAT WE WANT
XOR AX,AX
INT 16H
JMP MAIN_EXIT
MAIN_EXIT:
POP AX
POP BX
POP DX
RETF

;/**////////////////////////////////////////////////////////////////////////////
DATASEGMENT PROC NEAR
;//main order
WELCOME DB 'Welcome To My Programme!',0DH,0AH
OP1 DB '1.Simple',0DH,0AH
OP2 DB '2.Normal',0DH,0AH
OP3 DB '3.Good',0DH,0AH
OP4 DB '4.Excellent',0DH,0AH
RE DW '??'
CNT DB '?'
TEM DB '?'





;/**////////////////////////////////////////////////////////////////
STR_NAME DB 'WeiTao Luo'
STR_ID DB 'ID:0706230226',0DH,0AH
STR1 DB '0706230226',00H
STR2 DB '????????????????????'
ERROR DB 'Your input is invalid,plase input your id again,please press anykey to continue',0DH,0AH
RIGHT DB 'Your input is valid,please press anykey to boot the windows',0DH,0AH
CH1 DB 00H,04H,7FH,0FEH,44H,44H,44H,44H,44H,44H,7FH,0FCH,42H,04H,02H,00H,07H,0F0H,08H,10H,14H,20H,62H,0C0H,01H,00H,06H,00H,18H,00H,0E0H,00H
CH2 DB 08H,40H,08H,40H,08H,44H,17H,0FEH,10H,40H,30H,48H,57H,0FCH,90H,40H,10H,44H,1FH,0FEH,10H,44H,10H,44H,10H,54H,10H,48H,10H,40H,10H,40H
CH3 DB 00H,80H,40H,88H,37H,0FCH,10H,80H,83H,0F8H,60H,80H,2FH,0FEH,09H,08H,11H,08H,23H,0FEH,0E2H,08H,25H,08H,28H,88H,30H,88H,20H,28H,20H,10H
RET

;/**///////////////////////////////////////////////////////////////
;Forrest Gump
STARTWORD DB 'Forrest Gump !',0DH,0AH
WORD1 DB '1.Life was like a box of chocolates, you never know what you’re gonna get.',0DH,0AH
WORD2 DB '2.Stupid is as stupid does',0DH,0AH
WORD3 DB '3.It made me look like a duck in water',0DH,0AH
WORD4 DB '4.Jenny and I was like peas and carrots.',0DH,0AH
WORD5 DB '5.You just stay away from me please.',0DH,0AH



DATASEGMENT ENDP






;//SHOW NAME `
SHOW_NAME PROC NEAR
PUSH AX
PUSH BX
PUSH CX
PUSH DX

MOV AX,CS
MOV ES,AX

MOV AL,01H
MOV BH,0
MOV BL,74H
MOV CH,0
MOV CL,10 ;lenth
MOV DH,0
MOV DL,0
MOV BP,OFFSET STR_NAME

MOV AH,13H
INT 10H

POP DX
POP CX
POP BX
POP AX


RET



SHOW_NAME ENDP

;/**///////////////////////////////////////////////////////////////////////////////////////////////
;//SHOW STUDENT ID `
SHOW_ID PROC NEAR
PUSH AX
PUSH BX
PUSH CX
PUSH DX

MOV AX,CS
MOV ES,AX

MOV AL,01H
MOV BH,0
MOV BL,74H
MOV CH,0
MOV CL,15 ;
MOV DH,1
MOV DL,0
MOV BP,OFFSET STR_ID

MOV AH,13H
INT 10H

POP DX
POP CX
POP BX
POP AX
RET


SHOW_ID ENDP

;/**///////////////////////////////////////////////////////////////////////////////////////////////////
;SHOW FOR DEBUG
;****************************************************************************************************** `
SHOW_DEBUG PROC NEAR
PUSH AX
PUSH BX
PUSH CX
PUSH DX

MOV AX,CS
MOV ES,AX

MOV AL,01H
MOV BH,0
MOV BL,74H
MOV CH,0
MOV CL,10 ;
MOV DH,10
MOV DL,10
MOV BP,OFFSET ERROR

MOV AH,13H
INT 10H

POP DX
POP CX
POP BX
POP AX

SHOW_DEBUG ENDP


;/**///////////////////////////////////////////////////////////////////////////////////////////////
;******************************************************************************************************



;input your id
INPUT_STR2 PROC NEAR
PUSH DI
PUSH AX
MOV DI ,OFFSET STR2

NEXT:
MOV AH,0
INT 16H
CMP AL,13
JZ ENDPOINT

MOV AH,14
INT 10H

MOV [DI],AL
INC DI
JMP NEXT
ENDPOINT:
MOV AL,0
MOV [DI],AL

MOV AH,14
MOV AL,0AH
INT 10H
MOV AL,0DH
INT 10H
POP AX
POP DI
RET


INPUT_STR2 ENDP

;/**//////////////////////////////////////////////////////////////////////////////////////////////////
;output one string after the cursor,this is the most important use just like the cout.
SHOW_STRING PROC NEAR ;CX:lenth CS:[si] ,the lenth include enter character
PUSH AX

AGAIN:
MOV AH,14
MOV AL,[SI]
INT 10H
INC SI
LOOP AGAIN

POP AX
RET
SHOW_STRING ENDP

;/**/////////////////////////////////////////////////////////////////////////////////////////////

;//Cmp STR1 and STR2 which end with 0,if they are the same ,ZF = 0,else ZF = 1
CMP_STR1AND2 PROC NEAR
PUSH ES
PUSH AX
PUSH BX
PUSH DI
PUSH SI
MOV AX,CS
MOV ES,AX

MOV SI,OFFSET STR1
MOV DI,OFFSET STR2
AGAIN2:
CMPSB
JNZ NOTTHESAME
LOOP AGAIN2
JMP ISTHESAME ;

NOTTHESAME:
PUSHF
POP AX
MOV BX,0FFBFH
AND AX,BX
PUSH AX
POPF
JMP DONE


ISTHESAME:
PUSHF
POP AX
MOV BX,0FFFFH
AND AX,BX

PUSH AX
POPF
DONE:

POP SI
POP DI
POP BX
POP AX
POP ES
RET
CMP_STR1AND2 ENDP

;/**/////////////////////////////////////////////////////////////////////////////////////////////////

;CLR THE SCREEN
CLR PROC NEAR
PUSH AX
MOV AX,03H
INT 10H
POP AX
RET
CLR ENDP

;/**////////////////////////////////////////////////////////////////////////////////////////

CLR2 PROC NEAR
PUSHA
PUSH DX
PUSH BX
MOV AL,0
MOV AH,06H
MOV BH,07H
MOV CH,0
MOV CL,0
MOV DH, 100
MOV DL,100
INT 10H
POP BX
POP DX
POPA
RET
CLR2 ENDP

START_MENU PROC NEAR
PUSH CX
PUSH SI

MOV CX,26
MOV SI,OFFSET WELCOME
CALL SHOW_STRING


MOV CX,10
MOV SI,OFFSET OP1
CALL SHOW_STRING

MOV CX,10
MOV SI,OFFSET OP2
CALL SHOW_STRING

MOV CX,8
MOV SI,OFFSET OP3
CALL SHOW_STRING

MOV CX,13
MOV SI,OFFSET OP4
CALL SHOW_STRING
POP SI
POP CX

RET
START_MENU ENDP


OUTPUTCHINESENAME PROC NEAR ;interface DX: row ,CX Col,cs:[si] POINT THE HEAD OF THE ARRAY
PUSH ES
PUSH AX
PUSH BX
PUSH DI
PUSH BP


MOV AL,7
MOV BH,1
MOV AH,0CH






MOV CNT,16
MOV RE ,CX


L1:
PUSH BX
MOV BX,[SI]
MOV TEM,BH
MOV BH,BL
MOV BL,TEM
MOV [SI],BX
POP BX




MOV CX,RE

MOV DI,0001H
L2:
ROR DI,1
TEST [SI],DI
JZ L2END
INT 10H
L2END:
INC CX
CMP DI,0001H
JZ L1END
JMP L2

L1END:
INC SI
INC SI
INC DX
DEC CNT
CMP CNT,0
JZ THEEND
JMP L1

THEEND:


POP BP
POP DI
POP BX
POP AX
POP ES

RET
OUTPUTCHINESENAME ENDP


PICTURE PROC NEAR
PUSHA
PUSH ES
PUSH DS
MOV AX,CS
MOV ES,AX

MOV AX,0013H
INT 10H
MOV AL,7
MOV BH,1
MOV AH,0CH

MOV CX,1
MOV DX,19
INT 10H
MOV DX,20
INT 10H
MOV DX,21
INT 10H
MOV DX,22
INT 10H
MOV DX,23
INT 10H
MOV DX,24
INT 10H
MOV CX,2
MOV DX,18
INT 10H
MOV DX,15
INT 10H
MOV DX,16
INT 10H
MOV DX,17
INT 10H
MOV DX,28
INT 10H
MOV DX,25
INT 10H
MOV DX,26
INT 10H
MOV DX,27
INT 10H
MOV CX,3
MOV DX,13
INT 10H
MOV DX,12
INT 10H
MOV DX,14
INT 10H
MOV DX,31
INT 10H
MOV DX,29
INT 10H
MOV DX,30
INT 10H
MOV CX,4
MOV DX,11
INT 10H
MOV DX,32
INT 10H
MOV CX,5
MOV DX,9
INT 10H
MOV DX,10
INT 10H
MOV DX,34
INT 10H
MOV DX,33
MOV CX,6
MOV DX,35
INT 10H
MOV DX,8
INT 10H
MOV CX,7
MOV DX,7
INT 10H
MOV DX,36
INT 10H
MOV CX,8
MOV DX,6
INT 10H
MOV DX,37
INT 10H
MOV CX,9
MOV DX,5
INT 10H
MOV DX,38
INT 10H
MOV CX,10
MOV DX,4
INT 10H
MOV DX,39
INT 10H
MOV CX,11
MOV DX,4
INT 10H
MOV DX,39
INT 10H
MOV DX,10
INT 10H
MOV DX,11
INT 10H
MOV DX,12
INT 10H
MOV CX,12
MOV DX,3
INT 10H
MOV DX,40
INT 10H
MOV DX,8
INT 10H
MOV DX,9
INT 10H
MOV DX,10
INT 10H
MOV DX,14
INT 10H
MOV CX,13
MOV DX,3
INT 10H
MOV DX,40
INT 10H
MOV DX,6
INT 10H
MOV DX,7
INT 10H
MOV DX,15
INT 10H
MOV DX,16
INT 10H
MOV CX,14
MOV DX,2
INT 10H
MOV DX,41
INT 10H
MOV DX,5
INT 10H
MOV DX,17
INT 10H
MOV DX,18
INT 10H
MOV CX,15
MOV DX,2
INT 10H
MOV DX,41
INT 10H
MOV DX,4
INT 10H
MOV DX,19
INT 10H
MOV CX,16
MOV DX,2
INT 10H
MOV DX,3
INT 10H
MOV DX,20
INT 10H
MOV DX,41
INT 10H
MOV CX,17
MOV DX,2
INT 10H
MOV DX,20
INT 10H
MOV DX,41
INT 10H
MOV CX,18
MOV DX,1
INT 10H
MOV DX,42
INT 10H
MOV DX,11
INT 10H
MOV DX,20
INT 10H
MOV DX,32
INT 10H
MOV CX,19
MOV DX,1
INT 10H
MOV DX,42
INT 10H
MOV DX,10
INT 10H
MOV DX,12
INT 10H
MOV DX,31
INT 10H
MOV DX,33
INT 10H
MOV DX,21
INT 10H
MOV CX,20
MOV DX,1
INT 10H
MOV DX,42
INT 10H
MOV DX,9
INT 10H
MOV DX,13
INT 10H
MOV DX,30
INT 10H
MOV DX,34
INT 10H
MOV DX,21
INT 10H
MOV CX,21
MOV DX,1
INT 10H
MOV DX,42
INT 10H
MOV DX,8
INT 10H
MOV DX,14
INT 10H
MOV DX,29
INT 10H
MOV DX,35
INT 10H
MOV DX,21
INT 10H

MOV CX,42
MOV DX,19
INT 10H
MOV DX,20
INT 10H
MOV DX,21
INT 10H
MOV DX,22
INT 10H
MOV DX,23
INT 10H
MOV DX,24
INT 10H
MOV CX,41
MOV DX,18
INT 10H
MOV DX,15
INT 10H
MOV DX,16
INT 10H
MOV DX,17
INT 10H
MOV DX,28
INT 10H
MOV DX,25
INT 10H
MOV DX,26
INT 10H
MOV DX,27
INT 10H
MOV CX,40
MOV DX,13
INT 10H
MOV DX,12
INT 10H
MOV DX,14
INT 10H
MOV DX,31
INT 10H
MOV DX,29
INT 10H
MOV DX,30
INT 10H
MOV CX,39
MOV DX,11
INT 10H
MOV DX,32
INT 10H
MOV CX,38
MOV DX,9
INT 10H
MOV DX,10
INT 10H
MOV DX,34
INT 10H
MOV DX,33
MOV CX,37
MOV DX,35
INT 10H
MOV DX,8
INT 10H
MOV CX,36
MOV DX,7
INT 10H
MOV DX,36
INT 10H
MOV CX,35
MOV DX,6
INT 10H
MOV DX,37
INT 10H
MOV CX,34
MOV DX,5
INT 10H
MOV DX,38
INT 10H
MOV CX,33
MOV DX,4
INT 10H
MOV DX,39
INT 10H
MOV DX,31
INT 10H
MOV DX,32
INT 10H
MOV DX,33
INT 10H
MOV CX,32
MOV DX,4
INT 10H
MOV DX,39
INT 10H
MOV DX,29
INT 10H
MOV DX,30
INT 10H
MOV DX,34
INT 10H
MOV DX,35
INT 10H
MOV CX,31
MOV DX,3
INT 10H
MOV DX,40
INT 10H
MOV DX,27
INT 10H
MOV DX,28
INT 10H
MOV DX,35
INT 10H
MOV CX,30
MOV DX,3
INT 10H
MOV DX,40
INT 10H
MOV DX,26
INT 10H
MOV DX,37
INT 10H
MOV CX,29
MOV DX,2
INT 10H
MOV DX,41
INT 10H
MOV DX,24
INT 10H
MOV DX,25
INT 10H
MOV DX,38
INT 10H
MOV CX,28
MOV DX,2
INT 10H
MOV DX,41
INT 10H
MOV DX,23
INT 10H
MOV DX,39
INT 10H
MOV CX,27
MOV DX,2
INT 10H
MOV DX,40
INT 10H
MOV DX,22
INT 10H
MOV DX,41
INT 10H
MOV CX,26
MOV DX,2
INT 10H
MOV DX,22
INT 10H
MOV DX,41
INT 10H
MOV CX,25
MOV DX,1
INT 10H
MOV DX,42
INT 10H
MOV DX,11
INT 10H
MOV DX,22
INT 10H
MOV DX,32
INT 10H
MOV CX,24
MOV DX,1
INT 10H
MOV DX,42
INT 10H
MOV DX,10
INT 10H
MOV DX,12
INT 10H
MOV DX,31
INT 10H
MOV DX,33
INT 10H
MOV DX,22
INT 10H
MOV CX,23
MOV DX,1
INT 10H
MOV DX,42
INT 10H
MOV DX,9
INT 10H
MOV DX,13
INT 10H
MOV DX,30
INT 10H
MOV DX,34
INT 10H
MOV DX,21
INT 10H
MOV CX,22
MOV DX,1
INT 10H
MOV DX,42
INT 10H
MOV DX,8
INT 10H
MOV DX,14
INT 10H
MOV DX,29
INT 10H
MOV DX,35
INT 10H
MOV DX,21
INT 10H

MOV AH,0
INT 16H
MOV AX,0003H
INT 10H

POP DS
POP ES
POPA
RET
PICTURE ENDP




;//Main Function
SHOW_MAIN PROC NEAR
MOV AX,CS
MOV DS,AX
MOV AX,CS
MOV ES,AX

CALL START_MENU
MOV AH,0
INT 16H
CMP AL,31H
JZ OPTION1

CMP AL,32H
JZ OPTION2

CMP AL,33H
JZ OPTION3

CMP AL,34H
JZ OPTION4

;/this is for OPTION1

;/**////////////////////////////////////////////////////////////////////////////////
OPTION1:
CALL CLR

CALL SHOW_NAME ;output your english name
CALL SHOW_ID ;out put your student id
MOV CX,10 ;
CALL INPUT_STR2 ;input your id
CALL CMP_STR1AND2
JZ CORRECT

WORNG:
MOV CX,81
MOV SI,OFFSET ERROR
CALL SHOW_STRING
MOV AH,0
INT 16H
JMP OPTION1



CORRECT:
MOV CX,61
MOV SI,OFFSET RIGHT
CALL SHOW_STRING
; MOV AH,0
; INT 16H
JMP FINALEND


;/**/////////////////////////////////////////////////////////////////////////////////////
OPTION2:

CALL CLR
MOV AX,0013H
INT 10H
MOV CX,0
MOV DX,0
MOV SI,OFFSET CH1
CALL OUTPUTCHINESENAME

MOV CX,16
MOV DX,0
MOV SI,OFFSET CH2
CALL OUTPUTCHINESENAME

MOV CX,32
MOV DX,0
MOV SI,OFFSET CH3
CALL OUTPUTCHINESENAME

MOV AH,0H ;
INT 16H

JMP OPTION1
JMP FINALEND



OPTION3:
CALL PICTURE
MOV AH,0H
INT 16H
JMP FINALEND




OPTION4:
CALL CLR
MOV SI,OFFSET STARTWORD
MOV CX,16
CALL SHOW_STRING
MOV AL ,0AH
MOV AH,14
INT 10H
MOV AL ,0DH
MOV AH,14
INT 10H



MOV SI,OFFSET WORD1
MOV CX,77
CALL SHOW_STRING
MOV SI,OFFSET WORD2
MOV CX,38
CALL SHOW_STRING
MOV SI,OFFSET WORD3
MOV CX,40
CALL SHOW_STRING
MOV SI,OFFSET WORD4
MOV CX,42
CALL SHOW_STRING
MOV SI,OFFSET WORD5
MOV CX,38
CALL SHOW_STRING




FINALEND:

RET
SHOW_MAIN ENDP
END START

