(實驗三)
一. 實驗目的
1. 掌握程式設計中的子程式結構;
2. 熟練使用過程偽指令、子程式呼叫和返回等組合語言的指令編寫子程式;
3. 掌握數制轉換方法;
4. 掌握利用dos系統功能呼叫進行字元輸入及字元輸出(顯示)的方法。
二. 程式說明
1. 編寫十進位製到十六進製制轉換程式。要求從鍵盤取得乙個十進位制數,然後把該數以十六進製制形式在螢幕上顯示出來
2. 已知從buf開始存放了10個16進製製字資料,程式設計求出這10個數中的最大數,(將最大數存入max位元組單元),並將其以10進製數的形式在螢幕上顯示出來。
提示:以上兩題都要求採用子程式的方法)
3. 從鍵盤上輸入一行字元,如果這行字元比前一次輸入的一行字元長度長,則儲存該行字元,然後繼續輸入另一行字元;如果它比前一次輸入的行短,則不儲存這行字元。按下『$』輸入結束,最後將最長的一行字元顯示出來。(選作)
提示:定義資料段,包括兩個變數string和buffer,格式如下:
string db 0 ;存放字元的個數
db 80 dup (?), 0dh,0ah,『$』
;存放前一次輸入的字串,兼作顯示緩衝區
buffer db 80 ;輸入字串的緩衝區,最多輸入80個字元
db ?
db 80 dup (20h)
然後利用0ah號dos系統功能呼叫收入字元,用09h號系統功能呼叫輸出。)
三. 設計思想
1.先呼叫子函式decibin由鍵盤輸入乙個數字後,先減去30h把ascii碼形式轉換為十進位制數形式,儲存在bx中,再呼叫子函式binihex,用十六進製制形式顯示bx中的數。
2.利用子函式max依次比較,將buf中10個字的最大值放到bx中,再一次除以10000,1000,100,10,並分別把餘數放到bx,商放到dl,並轉換為ascii碼格式,即把十六進製制轉為10進製,最後呼叫2號功能輸出結果即可。
3.呼叫0ah功能,將輸入字元放到緩衝區,並把之後輸入的字串依次與緩衝區內容相比較,若小於緩衝區內容,則被替換,直到輸入$即停止輸入字串為止,輸出最終存放在string中的字串的內容。
四. 程式**
1.輸入10進製轉換為16進製制輸出
data segment
str1 db 0dh,0ah,'please input a number: ','$'
str2 db 0dh,0ah,'trans
data ends
decihex segment
assume cs:decihex,ds:data
main proc far
push ds
sub ax,ax
push ax
mov ax,data
mov ds,ax
repeat:
lea dx,str1
mov ah,09
int 21h
call decibin
lea dx,str2
mov ah,09
int 21h
call binihex
mov dl,0ah ;換行
mov ah,2
int 21h
jmp repeat
main endp
decibin proc near
mov bx,0
newchar:
mov ah,1
int 21h
sub al,30h
jl exit
cmp al,9d
jg exit
cbwxchg ax,bx
mov cx,10d
mul cx
xchg ax,bx
add bx,ax
jmp newchar
exit:
retdecibin endp
binihex proc near
mov ch,4
rotate: mov cl,4
rol bx,cl
mov al,bl
and al,0fh
add al,30h
cmp al,3ah
jl printit
add al,7h
printit:
mov dl,al
mov ah,2
int 21h
dec ch
jnz rotate
retbinihex endp
decihex ends
end main
2.data segment
buf dw 05h,0fh,15h,1fh,45h,25h,2ah,32h,3ah,3fh
data ends
code segment
assume cs:code,ds:data
main proc far
start:
mov ax,data
mov ds,ax
call max
call convey
mov ax,4c00h
int 21h
main endp
max proc near
mov bx,0
mov cl,10
mov ax,buf[bx]
repeat:
add bx,2
cmp ax,buf[bx]
jg greater
mov ax,buf[bx]
greater:
loop repeat
mov bx,ax
retmax endp
convey proc near
mov cx,10000d
call divid
mov cx,1000d
call divid
mov cx,100d
call divid
mov cx,10d
call divid
mov cx,1d
call divid
retconvey endp
divid proc near
mov ax,bx
mov dx,0
div cx
mov bx,dx
mov dl,al
add dl,30h
mov ah,2
int 21h
retdivid endp
code ends
end start
3.data segment
string db 0 ;存放字元的個數
db 80 dup (?), 0dh,0ah,'$' ;存放前一次輸入的字串,兼作顯示緩衝區
buffer db 82 ;輸入字串的緩衝區,最多輸入80個字元
db ?
db 80 dup (?)
out db 0dh,0ah,'longest string:','$'
data ends
code segment
assume cs:code,ds:data,es:data
main proc far
start:
mov ax,data
mov ds,ax
mov es,ax
repeat:
mov ah,02h
mov dl,0dh
int 21h
mov ah,02h
mov dl,0ah
int 21h
lea dx,buffer
mov ah,0ah
int 21h
mov al,buffer[2]
cmp al,'$'
jnz ***pare
jmp output
***pare:
mov al,buffer[1]
cmp al,string[0]
jl repeat
mov string,al
lea si,buffer[2]
lea di,string[1]
mov cl,buffer[1]
sub ch,ch
cldrep movsb
jmp repeat
output:
lea dx,out
mov ah,09h
int 21h
lea dx,string[1]
mov ah,09h
int 21h
mov ah,4ch
int 21h
main endp
code ends
end start
五. 結果分析
1.2.3.
組合語言實驗報告
電子科技大學 實驗報告 實驗一1 實驗名稱 彙編源程式的上機除錯操作基礎訓練 2 實驗學時 4 3 實驗內容和目的 實驗內容 1.debug命令的使用 2.程式的除錯與執行 3.編寫程式計算以下表示式 z 5x 2y 7 2 設x y的值放在位元組變數varx vary中,結果存放在位元組單元var...
組合語言實驗報告
組合語言課程設計 學院 專業 姓名 學號 組合語言是計算機專業的一門重要的專業基礎課,主要介紹組合語言程式設計的基本原理和方法。組合語言是一門理論性和實踐性較強的課程,輔助課堂教學的實驗有助於幫助學生理解組合語言的基本原理,鍛鍊學生的動手能力,提高學生的綜合應用知識的能力。1 利用debug除錯組合...
組合語言實驗報告組合語言實驗指導書
實驗報告 實驗課程組合語言程式 學生代號信念 學號5215201314 專業班級網路間諜088班 2009年 12月 25日 實驗1 利用debug除錯組合語言程式段54 實驗3 初級程式的編寫與除錯實驗 二59 實驗5 分支程式實驗65 實驗6 迴圈程式實驗68 實驗7 子程式實驗69 實驗8 字...