❶ 100行的匯編語言程序
dat segment
data db 10 p(0)
input db 'input:$'
output db 'output:$'
enter db 0dh,0ah,'$'
dat ends
cod segment
assume ds:dat,cs:cod
;-----------------------主程序
start:
mov ax,dat
mov ds,ax ;數據段寄存器賦值
lea si,data ;SI指向DATA數組首單元
mov cl,4
ppp:
mov bx,0 ;BX清零
lea dx,input ;這三行調用INT 21H中斷常式的9號功能輸出DS:DX指向的字元串,以'$'結尾
mov ah,9 ;以下代碼若有類似的三句,實現功能類似
int 21h ;顯示輸入提示
;-----------------------開始輸入十六進制數
get:
mov ah,1 ;這兩行調用INT 21H中斷常式1號功能,等待用戶輸入一個字元,保存入AL中
int 21h
;以下6對代碼依次比較輸入字元,並跳轉到相應操作
cmp al,'*'
jz kkk ;輸入'*'號,退出程序
cmp al,0dh ;0DH是回車鍵對應的字元
jz mess ;輸入回車,跳出get循環(get循環:實現輸入十六進制數並保存到BX的功能)
cmp al,30h ;這4行判斷是否是'0'~'9'
jb get
cmp al,39h
jbe num
cmp al,'A' ;這4行判斷是否是'A'~'F'
jb get
cmp al,'F'
jbe big
cmp al,'a' ;這4行判斷是否是'a'~'f'
jb get
cmp al,'f'
jbe big
jmp get
num: ;對數字進行處理
and al,0fh ;al高4位清零,保留低4位
jmp next
big: ;對大寫字母或者小寫字母進行處理
sub al,7
and al,0fh
next:
shl bx,cl ;BX左移4位
add bl,al ;將數字保存到BL的低4位中
jmp get
;-----------------------
mess:
lea dx,enter
mov ah,9
int 21h ;回車、換行
lea dx,output
mov ah,9
int 21h ;顯示輸出提示
mov dx,0
mov ax,bx
mov bx,10 ;進制數
again:
call buf
cmp ax,0 ;商如果為0,表示該十六進制數對應的十進制數的每一個數位的值都存入了DATA數組
jnz again
mov ah,2 ;INT 21H的2號功能:將DL中保存的ASCII碼對應的字元輸出
ttt:
dec si
mov dl,[si] ;取數據
int 21h ;顯示
cmp si,0
jnz ttt ;判斷是否取完DATA數組的所有元素,來控制循環
lea dx,enter
mov ah,9
int 21h ;回車、換行
jmp ppp ;開始下一輪輸入、轉換和輸出
kkk:
mov ah,4ch ;退出程序的操作
int 21h
;--------------------子程序
;傳入參數:BX,進制數10;DX、AX,表示一個32位16進制數
;返回值:AX
;功能:
;1. 將DX、AX表示的16進制數除以10,得到余數(余數在0~9之間,即對應十進制無符號數的個位數字)
;2. 將其轉換為對應字元的ASCII碼(即1轉換為'1'),並保存到SI指向的DATA數組元素的位置
;3. SI指向DATA數組的下一個元素
buf proc
div bx
add dl,30h
mov [si],dl
mov dl,0
inc si
ret
buf endp
cod ends
end start
;總結:這段程序實現的功能
;1. 十六進制輸入一個數,輸入回車表示輸入結束,輸入'*'表示退出程序,保存到寄存器中
;2. 十六進制數轉換為十進制無符號數,使用了類似於棧的操作的方法
;3. 十進制無符號數轉換為對應字元的ASCII碼(2和3由子程序buf完成)
;4. ASCII碼對應字元的輸出的功能
❷ 100條匯編語言編一個程序
請到我的博客隨便找一個吧!