实验10 编写子程序
生活随笔
收集整理的這篇文章主要介紹了
实验10 编写子程序
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1,顯示字符串
assume cs:codesg, ds:datasgdatasg segmentdb 'hello, world', 0 datasg endscodesg segment start: mov dh, 14mov dl, 40mov cl, 2mov ax, datasgmov ds, axmov si, 0 ;si point to datacall show_strmov ax, 4c00hint 21h;-------show_str--------------- show_str:push sipush dipush cxpush bxmov bl, clmov ax, 0b800hmov es, axmov di, 0mov al, 160mul dhmov di, axmov al, 2 ;es:di point to display memorymul dladd di, axs: xor cx, cxmov cl, ds:[si]jcxz okmov es:[di+0], clmov es:[di+1], bladd si, 1add di, 2jmp sok: pop bxpop cxpop dipop siretcodesg ends end start實驗結果:
2,解決除法溢出的問題
復習一下常規cpu中div指令的設計:
(1)除數:有8位和16位兩種,在一個reg或者內存單元中;
(2)被除數:默認放在ax或者dx和ax中,如果除數為8位,則被除數為16位,默認放在ax中;如果除數為16位,被除數則位32位,在dx和ax中存放,dx存放高位,ax存放低位;
(3)結果:如果除數為8位,則al存放商,ah存放余數;如果除數為16位,則ax存放商,dx存放余數。
現在要求的divdw功能是:被除數為dword型,除數為word型,結果為dword型,其中dx存放高16位,ax存放低16位,cx存放余數。
代碼如下:
assume cs:codesg, ds:datadata segmentdw 8 dup(0) data endscodesg segment start: mov ax, 4240hmov dx, 000fhmov cx, 0ahcall divdwmov ax, 4c00hint 21h;----------divdw-------------- divdw: push bx push ax mov ax,dx mov dx,0 div cx mov bx,ax ;將商的高位臨時放到bx中 pop ax div cx ;上一步div的余數(在dx中)做高位,連同ax中的數據(低位)一起做被除數 mov cx,dx ;將余數給cx mov dx,bx pop bx ret codesg ends end start實驗結果:
上面的算法完全按照 X/N=INT(H/N)*10000H+[REM(H/N)*10000H+L]/N(在課本208頁),對照代碼分析,一點都不難。
很多事情難,是因為一直拖延,不敢開始;
很多事情難,是因為太急,沒有堅持而匆匆放棄;
很多事情難,是因為只是看了一眼難。
加油。
3,數值顯示
;dtoc--------------------------- dtoc: push axpush bxpush cxpush dxpush sichange_dtoc:mov cx, 10xor dx, dxcall divdwxor ch, chadd cl, 30hmov ds:[di], cl ;把余數暫存到內存2中inc dimov cx, ax ;檢查商是否為0jcxz dtoc_retjmp change_dtocdtoc_ret:mov cx, disub di, 1 loop_s: mov bl, ds:[di]sub di, 1mov ds:[si], blinc siloop loop_spop sipop dxpop cxpop bxpop axret本程序比較傷腦筋的地方就是求出來數字的順序是從低位到高位,而輸出的順序是從高位到低位,這里有一個比較好的辦法是先把數字從低位到高位存放到數據段中的后邊某個位置,然后再反序復制到0位置開始的數據段中。
加油!
總結
以上是生活随笔為你收集整理的实验10 编写子程序的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: json对象转换为字符串数组 java_
- 下一篇: java 坦克大战 素材_经典90坦克大