組合語言學習筆記02

2021-10-06 22:55:03 字數 3333 閱讀 4693

程式接收使用者鍵入的一行字元(用回車符結束),並按字母,數字及其他字元分類計數,然後將結果存入以letter,digit和other為名的儲存單元中。

首先呼叫dos的9號功能呼叫輸出「please input the string:」字樣,提示使用者輸入字串,然後用dos的10號功能呼叫讀入字串至緩衝區,同時把字元個數送cl暫存器,用作迴圈控制次數。

用si指向字串的第乙個字元,然後通過ascii碼值的比較判斷當前字元屬於哪一類,該型別計數變數加一,si做自加一的操作,接著向後比較。

此實驗的難點在於如何設計子程式和安排跳轉指令。

筆者做的創新點在於最後顯示不同型別字元個數使用的是十進位制資料,如何用十進位制資料顯示出各種字元的個數,**下面的說明中將做進一步解釋。

;此處輸入資料段**

char db ?

digit db ?

other db ?

string label byte

max db 80

act db ?

print db 13,10

,'please input the string:'

,'$'

mess1 db 13,10

,'the total number of char : '

,'$'

mess2 db 13,10

,'the total number of digit : '

,'$'

mess3 db 13,10

,'the total number of other : '

,'$'

datas ends

stacks segment

;此處輸入堆疊段**

stacks ends

codes segment

assume cs:codes,ds:datas,ss:stacks

start:

mov ax,datas

mov ds,ax

;此處輸入**段**

push ds

sub ax,ax

push ax

mov es,ax

;對計數變數都賦立即數0

mov char,0

mov digit,

0 mov other,

0 ;提示使用者輸入字串

lea dx,print

mov ah,

09h int 21h

;輸入的字串送緩衝區

lea dx,string

mov ah,

0ah int 21h

sub ch,ch

mov cl,

[string+1]

lea si,string+

2 cmpstring:

mov al,

[si]

cmp al,

'0' jb other1;小於0為其他,

0到9為數字

cmp al,

'9' ja char1

inc digit

jmp loopoop

char1:

cmp al,

'a' jb other1 ;接上面,判斷9之後,大於9,小於a為其他,a到z為字母

cmp al,

'z' ja char2

inc char

jmp loopoop

char2:

cmp al,

'a';接上面,判斷z之後,大於z,小於a為其他,a到z為字母

jb other1

cmp al,

'z' ja other1

inc char

jmp loopoop

other1:

inc other

loopoop:

inc si

dec cl

cmp cl,

0 jz print1

jne cmpstring

print1:

;先顯示char型別統計結果

lea dx,mess1

mov ah,

09h int 21h

mov al,

char

call display

;顯示digit型別的統計結果

lea dx,mess2

mov ah,

09h int 21h

mov al,digit

call display

;顯示other型別的統計結果

lea dx,mess3

mov ah,

09h int 21h

mov al,other

call display

mov ah,

4ch int 21h

display:

mov ah,

0 mov bl,

10 div bl

add al,

30h

mov dl, al

mov bh, ah

mov ah,

02h

int21h

mov al, bh

add al,

30h mov dl, al

mov ah,

02h int

21h

ret

codes ends

end start

【對於display子程式的說明】:該子程式用於把統計到的十六進製制資料轉換成十進位制資料輸出。比如說al=15h,即21,表示某一型別字元數量,然後,這個過程就是,ax=0015h(21),除以bl,bl值為10則除完了的結果為2餘1,則ah=01,al=02, 即ax=0102h,那麼al+30h即為表示該數字的ascii碼值,則ax=0132h,dl=32,bh=01,顯示輸出dl,則顯示32碼對應的數字,2。把01給al,然後算出ascii碼,然後給dx,然後顯示,這樣就達到了用十進位制數字顯示統計之後各類字元數量的目的。

組合語言學習筆記

學習參考資料 大灰狼 講彙編 資料匯流排,位址匯流排,控制匯流排。位址匯流排有多少條就決定了cpu最大的記憶體使用量。80386有32位位址匯流排,所以它的定址能力就是4g.暫存器 通用暫存器,段暫存器,ax暫存器 通用暫存器,存放資料。高位位元組ah,低位位元組al。實體地址表示方法 位址加法器,...

組合語言學習筆記

cs ip是指向程式執行的位置 code segment ds 儲存記憶體中取資料的位址,data segment ss sp是指向堆疊的位置 stack segment cx 裡儲存的是loop執行的標誌 loop執行時,cx cx 1,若此時cx裡值為0,則跳出loop,否則繼續loop 初始 ...

組合語言學習筆記

編譯下面的程式,生成列表檔案,觀察標號在機器碼中變成了什麼?小組中的同學都說一說,說出你看到了什麼,說出你的疑問,讓小夥伴們一起解決。下面是程式 這個程式的功能沒有意義,只用於觀察程式中的標號 assume cs codesg,ds datasg datasg segment a db 1,2,3,...