汇编基础知识之输入输出
最近在學(xué)習(xí)匯編程序,但輸入輸出是我遇到的第一個(gè)難題,這里就簡(jiǎn)單講訴一些匯編的基本輸出輸出字符串、字符、輸出數(shù)字等知識(shí),僅供大家學(xué)習(xí)。這只是一些基礎(chǔ)知識(shí),匯編高手亦可以溫習(xí)一些基礎(chǔ)的輸入輸出知識(shí).
?
一.輸出字符串
下面是調(diào)用9號(hào)功能輸出字符串"Hello World"的代碼。
DATAS SEGMENT;輸出的字符串 13回車 10換行 $結(jié)束標(biāo)志(\0) Input DB 13,10,'Hello Word!',13,10,'$' DATAS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATAS START:MOV AX,DATASMOV DS,AX ;數(shù)據(jù)放入DSLEA DX,Input ;字符串偏移起始DX,同MOV DX,OFFSET ASC指令MOV AH,9 ;09功能 打印字符串INT 21H ;INT 21H是DOS中斷功能調(diào)用的中斷號(hào),調(diào)用功能MOV AH,4CH ;返回DOS系統(tǒng)INT 21H CODES ENDSEND START輸出結(jié)果為:
?
二.輸入輸出單個(gè)字符
下面是調(diào)用2號(hào)功能輸出單個(gè)字符"a"和調(diào)用1號(hào)功能輸入單個(gè)字符的代碼。
DATAS SEGMENT;此處輸入數(shù)據(jù)段代碼Input DB 13,10,'Please input:',13,10,'$' DATAS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATAS START:MOV AX,DATASMOV DS,AX ;數(shù)據(jù)放入DSMOV DL,'a' ;字符存入寄存器MOV AH,02H ;調(diào)用2號(hào)功能輸出單個(gè)字符INT 21H ;INT 21H調(diào)用功能;調(diào)用9號(hào)功能輸出字符串"請(qǐng)輸入"LEA DX,Input MOV AH,9 INT 21HMOV AH,01H ;調(diào)用1號(hào)功能輸入字符(只能輸入一個(gè)字符)INT 21HMOV AH,4CH ;返回DOS系統(tǒng)INT 21H CODES ENDSEND START?輸出結(jié)果為:
?
三.輸出4位數(shù)字
在做匯編實(shí)驗(yàn)時(shí),總是遇到一個(gè)問(wèn)題,不會(huì)輸出一串?dāng)?shù)字如:2030.(8位最大5位數(shù))
下面就是輸出一串?dāng)?shù)字的代碼,這里采用的方法是(必須是4位數(shù)字)
1.先除以1000.2030/1000=2(商)..30(余)判斷商是否為0,不為0輸出;
2.輸出玩千位2后,商賦值給寄存器接著跳轉(zhuǎn)到判斷百位;
3.這里重點(diǎn)是設(shè)置了一個(gè)判斷變量Nozero,如果這里是3/1000=0(商)..3(余),為0就判斷該變量是否為0,為0表示它小于1000,不輸出0,否則會(huì)輸出0003.而當(dāng)數(shù)字第一位不為0時(shí)(如2030第一位是2,不為0)就令變量Nozero=1,后面要輸出的0都是在數(shù)字中顯示輸出.(如2000,當(dāng)輸出2時(shí),Nozero=1,余數(shù)為0,后面的0均輸出.而30只會(huì)到十位Nozero才賦值為1,輸出個(gè)位的0).
4.依次判斷十位,個(gè)位.
輸出的結(jié)果是:而當(dāng)A賦值為3會(huì)輸出相應(yīng)的3而不是0003.
此方法似乎很笨拙,輸出數(shù)字每次都是書寫了4遍重復(fù)的輸出代碼,而且來(lái)回的跳轉(zhuǎn),但是更重要的是提供一個(gè)Nozero的思想,在C、C++、C#、Java中常用到的設(shè)置bool型變量的方法在匯編程序中同樣有用并好用.在實(shí)驗(yàn)中我也采用的是下面的定義子程序方法輸出數(shù)字.
?
四.采用函數(shù)輸出4位數(shù)字
下面是百度知道里面的一種方法,調(diào)用函數(shù)輸出數(shù)字的方法,由于還沒(méi)有學(xué)到子函數(shù),所以這里沒(méi)有驗(yàn)證該方法,但感覺(jué)此方法還是相當(dāng)有用的一種方法.上面設(shè)置的Nozero也是參照了它的思想.僅供大家學(xué)習(xí).
網(wǎng)址:http://zhidao.baidu.com/question/54461195.html
outd procpush cxmov nozero,0 ;like a boolean variable mov cx, 10000call decdivmov cx, 1000call decdivmov cx, 100call decdivmov cx, 10call decdivmov cx, 1call decdiv;cmp nozero, 0;jne outdexit;mov dl, 30h;mov ah, 2;int 21h outdexit:pop cxret ;call: 被除數(shù)在bx傳入,除數(shù)在cx傳入 ;ret: 打印商,余數(shù)送bx decdiv procmov ax, bxmov dx, 0div cxmov bx, dxmov dl, alcmp dl, 0jne dispdigitcmp nozero, 0jne dispdigitjmp decdivexit dispdigit:mov nozero, 1add dl, 30hmov ah, 2int 21h decdivexit:ret decdiv endp outd endp?
五.總結(jié)
最后,上面的文章主要是給剛學(xué)習(xí)匯編的同學(xué)參考,大神略過(guò).同時(shí),代碼也不是很優(yōu)化,比較冗余,但它還是提供了一些很好的匯編思想供大家學(xué)習(xí),希望大家能學(xué)到一些思想.反正對(duì)我剛學(xué)習(xí)匯編的此時(shí),上面4個(gè)代碼還是非常有用的.
由于剛學(xué)習(xí)發(fā)表博客,可能內(nèi)容和格式不是很好,還請(qǐng)海涵! By: Eastmount
總結(jié)
以上是生活随笔為你收集整理的汇编基础知识之输入输出的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Masm for Windows集成开发
- 下一篇: 汇编排序知识之冒泡排序