編譯環境:emu8086
附:ascii碼表
datas segment para 'data'
three db 3
;jun等是3個字母的,因此在陣列定位中,每3個位元組是乙個月
mess db 'input month number',13
,10,'$'
monin label byte ;為資料段中定義的下乙個變數提供不同的名稱和大小屬性,共享同乙個記憶體位置,label偽指令自身不分配記憶體
max db 1
;最多輸入的字元數
act db 0
;在讀入緩衝區時,此位置會自動儲存輸入數字的位數
mon db 3
dup(0)
;儲存輸入的數字,最多2個數字+
1回車 ;
alfmon db '>>>',13
,10,'$'
;作為緩衝區使用,這裡的》
>可以替換成別的字元,如?代表隨機填入。
montab db 'jan'
,'feb'
,'mar'
,'apr'
,'may'
,'jun'
db 'jul'
,'aug'
,'sep'
,'oct'
,'nov'
,'dec'
datas ends
codes segment para 'code'
assume cs:codes,ds:datas,es:datas
;關聯段與段暫存器,編譯軟體對assume不生成機器碼
start:
main proc far
push ds
mov ax,
0 push ax
mov ax,datas
mov ds,ax
mov es,ax
;input month
lea dx,mess ;輸出提示資訊
mov ah,
09int
21h ;執行這條指令時,al的值會改變成24,原因是中斷時al會返回剛剛輸出的字元,輸出的字元$的ascii碼就是24h
lea dx,monin
mov ah,
0ah ;鍵盤輸入到緩衝區,(ds:dx+2)
=輸入字串起始位址
int21h
mov dl,
13;回車-
>回到當前行的行首
mov ah,
02;顯示輸出,dl=輸出字元
int21h
mov dl,
10;換行-
>移動到下一行的相同位置
mov ah,
02;顯示輸出,dl=輸出字元
int21h
;cmp的功能相當於減法指令,cmp不儲存結果,只影響符號位。sub指令執行過後ax被賦為減法的結果
cmp act,
0;用act減去0,判斷輸入的數字位數是否為0
(直接回車,就退出)
je exit ;若zf=1-
>減法運算結果全為0 則跳轉
;convert ascii to binary
mov ah,
30h ;set up month
cmp act,
2;用act減去2,判斷輸入的數字位數是否為2
je two ;若zf=1-
>減法運算結果全為0 則跳轉
mov al,mon
jmp conv
two:
mov al,mon+
1 mov ah,mon
conv:
xor ax,
3030h ;由於0的ascii碼為30,所以要減去30才能獲得對應的數字
cmp ah,
0;month 01-09
? 是否輸入了01,02
,03這樣的形式
jz loc ;輸入了02等形式,直接跳轉到loc**段
sub ah,ah ;ah暫存器置0
add al,
10;al暫存器中的值+
10;locate month in table
loc:
lea si,montab ;取得月份縮寫陣列的位址
dec al ;陣列從0開始
mul three ;每個月份縮寫佔3個位元組,移動到下乙個月份需要移動3個位元組
add si,ax ;定位到對應月份縮寫的位址
mov cx,
03;設定迴圈次數為3
cld ;將標誌暫存器flag的方向標誌位df清零。在字串操作中使變址暫存器si或di的位址指標自動增加,字串處理由前往後
lea di,alfmon ;取得待輸出變數的位址到di中
rep movsb ;重複movsb指令3次 movsb字元傳送指令,將ds:si的位元組複製到es:di指向的位址。此處是將月份縮寫陣列中 3個縮寫字母複製到待輸出區中
;display alpha month
lea dx,alfmon ;將待輸出區的位址存到dx中,即將呼叫09功能輸出月份縮寫
mov ah,
09int
21h jmp start ;重複
exit:
mov ah,
4ch int
21hmain endp
codes ends
end main
label
name label type
為資料段中定義的下乙個變數提供不同的名稱和大小屬性,共享同乙個記憶體位置,label偽指令自身不分配記憶體。在本**中可以視為用monin來作為輸入緩衝區記憶體位址的名字,在mov dx,monin並呼叫輸入功能時,系統會根據記憶體位址開始第乙個字來設定最大可輸入的字元數(包括回車,回車必須要占用1個字元數),月份的數字最多是2位+1位回車符,因此max設定為3。第二個字用於儲存實際輸入字元的個數,在輸入字元後,系統會自動將第二個字賦值為實際輸入字元的個數(此處回車不會算入其中,如果直接回車,那麼act是0,在後續cmp act 0會呼叫退出**)。第三~n個字作為輸入的緩衝區,系統會將輸入的字元儲存到第三個字開始的位址中(回車也會被儲存進去),本**中緩衝區從第3個字開始到第6個字(包含)結束,因此最多2個數字+回車。
具體看**中的注釋
cmp
cmp的功能相當於減法指令,cmp不儲存結果,只影響符號位。sub指令執行過後ax被賦為減法的結果。如果減法的結果為0,則會將zf置為1
je
je code如果zf=1,則跳轉到語句code
rep
先將迴圈次數存入cx,重複(cx)次語句。注意:每迴圈一次cx會自動減1
cld
將標誌暫存器flag的方向標誌位df清零。在字串操作中使變址暫存器si或di的位址指標自動增加,字串處理由前往後。
movsb
C語言 輸出月份的英文
要成為絕世高手,並非一朝一夕,除非是天生武學奇才,但是這種人 萬中無一 包租婆 這道理放在c語言學習上也一併受用。在程式設計方面有著天賦異稟的人畢竟是少數,我們大多數人想要從c語言小白高階到高手,需要經歷的是日積月累的學習。那麼如何學習呢?當然是每天都練習一道c語言題目!c語言編寫乙個程式,輸入月份...
C語言 輸出月份英文名
本題要求實現函式,可以返回乙個給定月份的英文名稱。函式介面定義 char getmonth int n 函式getmonth應返回儲存了n對應的月份英文名稱的字串頭指標。如果傳入的引數n不是乙個代表月份的數字,則返回空指標null。裁判測試程式樣例 include char getmonth int...
習題11 1 輸出月份英文名 (15 分)
本題要求實現函式,可以返回乙個給定月份的英文名稱。函式介面定義 char getmonth int n 函式getmonth應返回儲存了n對應的月份英文名稱的字串頭指標。如果傳入的引數n不是乙個代表月份的數字,則返回空指標null。裁判測試程式樣例 include char getmonth int...