日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

汇编语言程序设计实验(六)——子程序设计

發布時間:2023/12/10 编程问答 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 汇编语言程序设计实验(六)——子程序设计 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄

    • 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’'數值或者數據位數超出邊界,則轉至報錯提示。

include io32.inc .data count = 5 ;預留五個空間 array dword count dup(0) ;聲明數組 temp dword ? ;工具變量 .code start:mov ecx, countmov ebx, offset array ;初始化數組指針 again: call rdbd ;調用子程序,從鍵盤讀一個數據mov eax,temp ;獲得出口參數mov [ebx],eax ;存放到輸入緩沖區call dispbdadd ebx,4 ;數組指針移動loop again exit 0rdbd proc ;二進制輸入子程序、push eax ;出口參數,共享工具變量temppush ebx push ecx rdbd1: xor ebx,ebx ;ebx用于存放二進制結果mov ecx,32 ;限制輸入字符的個數到32個 rdbd2: call readc ;輸入一個字符cmp al,'0' ;0小,轉至報錯jb rderr cmp al,'1' ;1大,轉至報錯ja rderrsub al,'0' ;獲得真正的數據shl ebx,1 ;前邊輸入后轉化為二進制的數據左移一位再相加or bl,al ;bl和al相加loop rdbd2 ;循環鍵入字符mov temp,ebx ;把ebx的二進制結果存放于temp返回call dispcrlfpop ecxpop ebxpop eaxret rderr: mov eax,offset errmsg ;顯示錯誤信息call dispmsgjmp rdbd1 errmsg byte 0dh,0ah,'Inpput error,enter again:',0 rdbd endp ;子程序結束end start

運行結果:

(2) 二進制顯示子程序

編寫二進制顯示子程序、以及驗證子程序的主程序(教材習題5.8),并運行正確。
代碼思路:將得到的二進制數每次右移一位,通過判斷CF是否為1來分別處理,處理時加30H轉化為ACSII碼,后將每次得到的ACSII碼入棧,此時在原數據中每個位在棧中就是低位到高位了,輸出的時候依次從棧中彈出就是正確的順序。

include io32.inc.data array dword 10110101b,1010000101b,0001000100001000101b,1001010101010b writebuf byte 12 dup (0) ;顯示緩沖區.code start:mov ecx, lengthof array ;數組長度計數器mov ebx, 0 ;初始化數組指針 again: mov eax, array[ebx*4] ;逐個取出字符數組中元素call writecall dispcrlfinc ebx ;數組指針移動loop againexit 0;子程序部分 write procpush ebx ;數組指針先入棧push ecx ;計數器再入棧push edx ;存放每個留在緩沖區的二進制數的edx入棧mov ebx, offset writebuf ;字符內部數組首指針,指向顯示緩沖區 write1: mov ecx,32 ;每個二進制數最多表示到32位push ecx ;結束標志入棧mov edx,0 write2: cmp eax,0 ;移位結束標志jz write3 ;所有有效數字位已經右移完畢 shr eax,1 ;每次將最低位移出來到CFjnc write_0 ;若最低位為0jmp write_1 write_0: mov edx,0add edx,30h ;30h轉換為ACSII碼push edx ;該字符入棧jmp write2 write_1: mov edx,1add edx,30h ;30h轉換為ACSII碼push edx ;該字符入棧jmp write2 write3: pop edx ;對該數從高位到低位依次出棧cmp edx,ecx ;出棧結束判斷jz write4mov [ebx],dl ;將棧中彈出的值放入數組inc ebx ;數組指針移動 jmp write3 write4: mov byte ptr[ebx],0 ;給顯示內容加上結尾標志mov eax,offset writebuf ;打印緩沖區內容call dispmsg pop edxpop ecxpop ebxret write endpend start

運行結果:

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,
編寫無符號十進制數的輸入輸出子程序、以及驗證子程序的主程序,并運行正確。

.data count = 5 array dword count dup(0) temp dword ? readbuf byte 30 dup(0).code begin: mov ecx,count mov ebx,offset array ;ebx為數組指針 again: call read ;調用子程序,輸入一個數據mov eax,temp ;獲得出口參數mov [ebx],eax ;存放到數據緩沖區add ebx,4 ;指針移動dec ecx ;計數器遞減jnz again ;循環判定條件exit 0 ;退出主程序read proc ;輸入有符號十進制數的子程序push eax ;出口參數:變量temp= 補碼表示的二進制數值push ebx ;說明:負數用"-"引導push ecx push edx read0: mov eax,offset readbufcall readmsg ;輸入一個字符串test eax,eax ;沒有輸入數據,轉向錯誤處理cmp eax,12 ;ja readerr ;輸入超過12個字符,轉向錯誤處理mov edx, offset readbuf ;edx指向輸入緩沖區xor ebx,ebx ;ebx保存結果xor ecx,ecx ;ecx為正負標志,0為正,-1為負mov al,[edx] ;取一個字符cmp al,'+' ;"+",繼續jz read1 cmp al,'-' ;'-',設置-1標志jnz read2 ;轉至無符號處理區read2mov ecx,-1 ;ecx保存符號位 read1: inc edx ;取下一個字符mov al,[edx]test al,al ;是結尾0,轉向求補碼jz read3 read2: cmp al,'0' ;不是0~9之間的數碼,輸入錯誤jb readerr cmp al,'9' ja readerrsub al,30h ;0~9之間的數碼,轉換為二進制數imul ebx,10 ;原數值乘10:ebx = ebx *10jc readerr ;乘積溢出處理movzx eax,al ;零位擴展,便與相加add ebx,eax ;原數值乘10后與新數值相加cmp ebx,80000000h ;數據超過2^31,出錯 readerr: mov eax,offset errmsg ;顯示出錯信息call dispmsg jmp read0 ; read3: test ecx,ecx ;判斷是正數還是負數jz read4neg ebx ;是負數,進行求補jmp read5 read4: cmp ebx,7fffffffh ;正數超過2^31-1,出錯ja readerr read5: mov temp,ebx ;設置出口參數pop edxpop ecxpop ebxpop eaxret errmsg byte 'error!!',13,10,0 read endpend begin

(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

總結

以上是生活随笔為你收集整理的汇编语言程序设计实验(六)——子程序设计的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。