汇编语言程序设计实验(六)——子程序设计
目錄
- 1.實驗目的及內容
- 2、實驗內容
- 2.1 二進制輸入輸出子程序
- (1) 二進制輸入子程序
- (2) 二進制顯示子程序
- 2.2 主存區域數據顯示子程序
- 2.3 十進制數的輸入和顯示子程序
- (1) 有符號十進制數輸入子程序
- (2) 有符號十進制數顯示子程序
- (3) 無符號十進制數顯示子程序
- (3) 無符號十進制數輸入子程序
1.實驗目的及內容
理解子程序結構的特點,熟悉子程序參數傳遞的方法,掌握子程序的編寫。
2、實驗內容
2.1 二進制輸入輸出子程序
(1) 二進制輸入子程序
編寫二進制輸入子程序、以及驗證子程序的主程序,并運行正確。
代碼思路:(1)利用字符輸入子程序readc輸入一個字符,判斷是否是0或1,若合法則直接減去30h轉化為數值。
(2) 重復轉換字符的同時,需要將前面一次得到的總數值左移一位,并與剛得到的新數值進行相加。
(3) 如果輸入了非’‘0’‘或非’‘1’'數值或者數據位數超出邊界,則轉至報錯提示。
運行結果:
(2) 二進制顯示子程序
編寫二進制顯示子程序、以及驗證子程序的主程序(教材習題5.8),并運行正確。
代碼思路:將得到的二進制數每次右移一位,通過判斷CF是否為1來分別處理,處理時加30H轉化為ACSII碼,后將每次得到的ACSII碼入棧,此時在原數據中每個位在棧中就是低位到高位了,輸出的時候依次從棧中彈出就是正確的順序。
運行結果:
2.2 主存區域數據顯示子程序
編寫逐個字節顯示主存區域數據的子程序和主程序(教材習題5.13),并運行正確。
代碼思路:利用十六進制字節顯示程序,將主存區域的數據(如字符數組)按字節從低位(字符數組首元素)到高位進行輸出即可,每按字節輸出一個兩位十六進制數數組指針移動一位。
代碼:
include io32.inc.data array byte 'This is a test.' writebuf byte 12 dup (0) ;顯示緩沖區.code start: mov eax,offset array ;將數組主存偏移地址給eaxmov ecx,lengthof array ;ecx存放字節數call dispmem ;調用子程序按字節從低地址到高地址輸出exit 0;子程序部分 dispmem procpush eax ;保護eaxpush ecx ;保護ecx mov ebx,eax ;先把整體32位傳給ebx,ebx做數組指針 again: mov eax,[ebx] ;把數組中元素傳給eaxcall disphb ;利用十六進制字節顯示子程序mov eax, 32 ;輸出空格call dispc inc ebx ;指針移動loop againdispmem endp ;子程序結束end start運行結果:
2.3 十進制數的輸入和顯示子程序
(1) 有符號十進制數輸入子程序
編寫有符號十進制數的輸入子程序、以及驗證子程序的主程序,并運行正確。
思路:(1)首先判斷數據是否是0、負數或正數,是0則直接顯示’0’退出。
(2) 若輸入有符號數為負數,顯示符號’-’,求數據的絕對值。
(3) 數據除以10,如十進制正數123,
編寫無符號十進制數的輸入輸出子程序、以及驗證子程序的主程序,并運行正確。
(2) 有符號十進制數顯示子程序
編寫有符號十進制數的顯示子程序、以及驗證子程序的主程序,并運行正確。
代碼思路:(1) 首先判斷給的數據是否是0,若為0則直接輸出’0’。
(2) 是負數就在數組首端放置’-’,并求數據絕對值。
(3) 數據除以10,余數為10進制數碼,加30h轉化為ACSII碼之后放在字符數組edx中保存。
(3) 重復(3),直到商為0時結束。
程序代碼:
include io32.inc.data array dword 1234567890,-1234,0,1,-987654321,32767,-32768,5678,-5678,9000 writebuf byte 12 dup (0) ;顯示緩沖區.code start: mov ecx, lengthof array ;數組長度計數器 mov ebx, 0 again: mov eax, array[ebx*4] ;逐個取出字符數組中元素call write ;調用子程序,顯示一個數據call dispcrlf inc ebx ;數組指針移動loop again exit 0;子程序部分 write procpush ebxpush ecxpush edxmov ebx, offset writebuf ;字符內部數組首指針,指向顯示緩沖區test eax,eax ;判斷正/負數(結果不為0),0(結果為0),jnz write1 ;結果不為0,要么正,要么負,轉至write1進一步mov byte ptr[ebx],'0'inc ebx ;按字節來,數組指針每次增一jmp write5 write1: jns write2 ;是正數,轉至write2處理mov byte ptr[ebx],'-' ;若為負數,則首先給字符數組傳入一個負號inc ebx ;字符數組指針往后移動neg eax ;對eax進行求補 write2: mov ecx,10 ;除數 ecx=10 push ecx write3: cmp eax,0 ;若該位數為0,則轉至write4jz write4 xor edx,edx ;edx,被除數高位清零div ecx ;除以10,取余add edx, 30h ;余數轉化為ACSII碼push edx ;將最低位數字壓棧jmp write3 write4: pop edx ;從高位到低位依次彈出棧中存放的數字cmp edx,ecx ;和除數10進行比較,是結束標志10,轉至打印處理je write5 mov [ebx],dl ;將余數edx的低八位dl放進字符數組inc ebx ;數組指針移動,循環輸出存放的數jmp write4 write5: mov byte ptr[ebx],0 ;字符數組結束標志mov eax, offset writebuf ;打印緩沖區內容call dispmsg pop edxpop ecxpop ebxret write endpend start運行結果:
(3) 無符號十進制數顯示子程序
代碼思路:(1) 首先判斷給的數據是否是0,若為0則直接輸出’0’。
(2 數據除以10,余數為10進制數碼,加30h轉化為ACSII碼之后放在字符數組edx中保存。
(3) 重復(3),直到商為0時結束div。
(4) 持續pop出棧頂元素給edx,此時出棧順序剛好是從高位到低位。
程序代碼:
include io32.inc.data array dword 1234567890,1234,0,1,987654321,32767,32768,5678,9000 writebuf byte 12 dup (0) ;顯示緩沖區.code start: mov ecx, lengthof array ;ecx為數組長度計數器 mov ebx, 0 again:mov eax, array[ebx*4] ;使用共享變量傳遞參數call write ;調用子程序,顯示一個數a,需要保存ebx、ecx的值call dispcrlfinc ebx ;數組指針移動loop againexit 0;子程序write proc push ebxpush ecxpush edxmov ebx, offset writebuf ;字符內部數組首指針,指向顯示緩沖區test eax,eax ;若為0,則直接輸出jnz write1 ;若不為0,則進一步處理mov byte ptr[ebx],'0' ;直接填充字符0inc ebx ;數組指針后移jmp write4 ;轉至打印緩沖區 write1: mov ecx,10 ;被除數ecx= 10push ecx ;結束標志,當edx==ecx時結束popwrite2: cmp eax,0 ;判斷商是否為0jz write3 ;商為0,準備輸出xor edx,edx ;被除數最高位清零div ecx ;商不為0,繼續作除法add edx, 30h ;余數轉化為ACSII碼push edx ;余數(0~9區間)入棧jmp write2 write3: pop edx ;從高位到低位依次pop出來cmp edx,ecx ;判斷該數是否pop完畢jz write4 ;pop完畢,轉至輸出緩沖區mov [ebx],dl ;把從棧中彈出的數位存至數組,ACSII<127,用dl即可inc ebx ;數字內部字符數組,每次增1jmp write3 write4: mov byte ptr[ebx],0 ;數組末尾加0mov eax, offset writebuf ;打印緩沖區內容call dispmsg pop edxpop ecxpop ebxret write endp end start(3) 無符號十進制數輸入子程序
include io32.inc.data count = 5 ;預留5個空間 array dword count dup(0) ;初始化數組 temp dword ? ;工具變量 readbuf byte 30 dup(0) ;輸入緩沖區 .code start: mov ecx,count mov ebx,offset array ;ebx為數組指針 again: call read ;調用子程序,輸入一個數據mov eax,temp ;將返回的temp傳回eaxmov [ebx*4],eax ;存放到數據緩沖區inc ebx ;數組指針移動loop again ;循環將所有數據全部輸出exit 0;子程序部分 read proc push ebx ;主程序中數組指針,需要保護push ecx ;主程序中計數器,需要保護 read0: mov eax,offset readbuf ;輸入緩沖區首地址傳給eaxcall readmsg ;輸入一個字符串test eax,eax ;沒有輸入數據,轉向錯誤處理cmp eax,12 ;輸入若超過12個字符,則轉向錯誤處理ja readerrmov edx, offset readbuf ;edx作為數組指針xor ebx,ebx ;ebx保存結果 read1: mov al,[edx] ;從數組中取出一個字符test al,al ;判斷是不是字符串結尾jz read2 ;是結尾,輸出該數inc edxcmp al,'0' ;若某一位小于0,輸入錯誤jb readerrcmp al,'9'ja readerrsub al,30h ;ACSII碼轉化為0~9區間的數imul ebx,10 ;ebx = ebx*10,給權重,初始時ebx=0jc readerr ;乘積溢出處理movzx eax,al ;零位擴展,便于前數ebx和當前位al相加add ebx,eaxcmp ebx,0ffffffffh ;判斷數據是否超過2^32-1jbe read1 ;沒超過,繼續取下一個字符 readerr: mov eax,offset errmsg ;顯示出錯信息call dispmsg jmp read0 ;再次輸入 read2: mov temp,ebx ;設置出口參數pop ecxpop ebxret errmsg byte 'error!!',13,10,0 read endpend start總結
以上是生活随笔為你收集整理的汇编语言程序设计实验(六)——子程序设计的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: astc贴图格式是什么意思_c4d配合A
- 下一篇: 汇编语言程序设计实验三