TITLE ***HELLO,WORLD進階程序之選擇分支 BY LLUCT***
DATA SEGMENT ;定義數據段
MSG1 DB '***WELCOME TO MY PROGRAM BY LLUCT***','$'
;定義輸出的第一個字符串信息,字符串必須用DB定義,$為結束標志
MSG2 DB '1:BASIC MESSAGE 2:ADVANCED MESSAGE','$'
;定義輸出的字符串信息:選擇菜單
MSG3 DB 'PLEASE CHOOSE:','$'
;定義輸出的字符串信息:選擇前綴
MSG4 DB 'HELLO,WORLD!^-^','$'
;定義輸出的字符串信息:分支1的信息
MSG5 DB 'THIS IS MY FIRST ASM_86 PROGRAM! @^-^@','$'
;定義輸出的字符串信息:分支2的信息
ERRMSG DB 'CHOOSE ERROR! -_-b','$'
;定義輸出的字符串信息:選擇錯誤信息
DATA ENDS ;數據段結尾
CODE SEGMENT ;定義代碼段
ASSUME CS:CODE ;規定CS的內容
ASSUME DS:DATA ;規定DS的內容
START: MOV AX,DATA ;程序從START開始
MOV DS,AX ;DS置初值,DATA的段地址
CALL ENTER ;調用顯示回車換行子程序
LEA DX,MSG1 ;輸出第一個字符串的偏移地址
CALL DISPCHS ;調用顯示字符串子程序
CALL ENTER ;調用顯示回車換行子程序
CALL ENTER ;這個...同上啊^-^
LEA DX,MSG2 ;輸出第二個字符串的偏移地址
CALL DISPCHS ;調用顯示字符串子程序
AGAIN: CALL ENTER ;定義AGAIN標號.用於選擇錯誤循環
LEA DX,MSG3 ;輸出第三個字符串的偏移地址
CALL DISPCHS ;調用顯示字符串子程序
MOV AH,01H ;調用1號功能:從鍵盤輸入一個字符並回顯
INT 21H ;完成輸入回顯
CMP AL,'1' ;輸入的字符和1相比較
JE BASICP ;如果相等,轉移到BASICP標號(JE=Jump if Equal)
CMP AL,'2' ;輸入的字符和2相比較 ||
JE ADVANP ;如果相等,轉移到ADVANP標號(JE=如果相等就轉移)
JMP ERROR ;否則就無條件轉移到ERROR標號
EXIT: MOV AH,4CH ;4C號功能調用:終止當前程序並返回調用程序
INT 21H ;返回DOS
BASICP: CALL ENTER ;什麼,還要解釋啊.暈-_-!!!
LEA DX,MSG4 ;輸出第三個字符串的偏移地址
CALL DISPCHS ;調用顯示字符串子程序
CALL ENTER ;..........
JMP EXIT ;無條件轉移到EXIT標號
ADVANP: CALL ENTER ;55555555
LEA DX,MSG5 ;解釋了四次,應該懂了吧
CALL DISPCHS ;調用顯示字符串子程序
CALL ENTER ;再問就死給你看
JMP EXIT ;無條件轉移到EXIT標號
ERROR: CALL ENTER
LEA DX,ERRMSG ;輸出選擇錯誤信息
CALL DISPCHS ;調用顯示字符串子程序
MOV DL,07H ;輸出ASCII碼的報警(響鈴)控制符BEL(07H)
CALL DISPCH ;調用顯示單個字符子程序
CALL ENTER
JMP AGAIN
DISPCH PROC NEAR
;顯示單個字符子程序,NEAR說明子程序和主程序在同一個代碼段中(現無主程序調用)
MOV AH,02H ;2號功能調用:顯示器輸出字符
INT 21H ;完成輸出顯示
RET ;返回
DISPCH ENDP ;子程序結尾
ENTER PROC NEAR ;顯示回車換行子程序
MOV DL,0DH ;輸出ASCII碼的回車控制符CR(0DH)
CALL DISPCH ;調用顯示單個字符子程序
MOV DL,0AH ;輸出ASCII碼的換行控制符LF(0AH)
CALL DISPCH ;調用顯示單個字符子程序
RET ;返回
ENTER ENDP ;子程序結尾
DISPCHS PROC NEAR
;顯示字符串子程序,NEAR說明子程序和主程序在同一個代碼段中(現無主程序調用)
MOV AH,09H ;9號功能調用:顯示字符串
INT 21H ;完成輸出顯示
RET
DISPCHS ENDP
CODE ENDS ;代碼段結尾
END START ;結束匯編
;把以上代碼復制到記事本等文本程序中,並保存.(如helloch.asm)
;編譯:masm helloch.asm
;連接:link helloch.obj
;執行:helloch.exe
======================================================
title ***hello,world進階之字符串輸入輸出 by lluct***
data segment ;定義數據段
input db 100 dup(?)
;定義輸入的字符串,字符串必須用db定義,長度為100個字節
msg1 db 'Hello,','$'
;定義輸出的前綴字符串信息,字符串必須用db定義,$為結束標志(24h)
msg2 db ',Welcome to here!','$'
;定義輸出的後綴字符串信息
headmsg db 'PLEASE INPUT YOUR NAME:','$'
;開始顯示的字符串信息
data ends ;數據段結尾
code segment ;定義代碼段
assume cs:code ;規定cs的內容
assume ds:data ;規定ds的內容
start: mov ax,data ;程序從start開始
mov ds,ax ;ds置初值,data的段地址
mov si,0 ;變址寄存器置初值0
call enter ;調用顯示回車換行子程序
lea dx,headmsg ;輸出開始顯示的字符串的偏移地址
call dispchs ;調用顯示字符串子程序
repeat: mov ah,01h
;定義repeat標號,用於循環輸入單個字符.調用1號功能:從鍵盤輸入一個字符並回顯
int 21h ;完成輸入回顯
cmp al,0dh ;輸入的字符和CR(回車)比較
je exit ;如果等於回車就轉移到exit
mov input[si],al ;把al的值傳送到input的si地址中(好像是這樣吧)
exit: call enter
mov input[si],24h ;給輸入完成的字符串加上結束標志($)
call enter
lea dx,msg1 ;輸出前綴字符串的偏移地址
call dispchs ;調用顯示字符串子程序
lea dx,input ;輸出剛才輸入的字符串
call dispchs
lea dx,msg2
call dispchs
call enter
mov ah,4ch ;4c號功能調用:終止當前程序並返回調用程序
int 21h ;返回dos
enter proc near ;顯示回車換行子程序
mov dl,0dh ;輸出ascii碼的回車控制符cr(0dh)
call dispch
mov dl,0ah ;輸出ascii碼的換行控制符lf(0ah)
call dispch
ret ;返回
enter endp ;子程序結束
dispch proc near
mov ah,02h ;2號功能調用:顯示器輸出字符
int 21h ;完成輸出顯示
ret ;返回
dispch endp
dispchs proc near
mov ah,09h ;9號功能調用:顯示字符串
int 21h ;完成輸出顯示
ret ;返回
dispchs endp
code ends ;代碼段結尾
end start ;結束匯編
;把以上代碼復制到記事本等文本程序中,並保存.(如heinout.c)
;編譯:masm heinout.asm
;連接:link heinout.obj
;執行:heinout.exe