彙編學習筆記 輸出月份縮寫

2021-09-29 11:29:52 字數 3985 閱讀 8582

編譯環境: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...