匯編基礎知識之輸入輸出
最近在學習匯編程序,但輸入輸出是我遇到的第一個難題,這裏就簡單講訴一些匯編的基本輸出輸出字符串、字符、輸出數字等知識,僅供大家學習。這隻是一些基礎知識,匯編高手亦可以溫習一些基礎的輸入輸出知識.
一.輸出字符串
下麵是調用9號功能輸出字符串"Hello World"的代碼。
DATAS SEGMENT ;輸出的字符串 13回車 10換行 $結束標誌(\0) Input DB 13,10,'Hello Word!',13,10,'$' DATAS ENDS CODES SEGMENT ASSUME CS:CODES,DS:DATAS START: MOV AX,DATAS MOV DS,AX ;數據放入DS LEA DX,Input ;字符串偏移起始DX,同MOV DX,OFFSET ASC指令 MOV AH,9 ;09功能 打印字符串 INT 21H ;INT 21H是DOS中斷功能調用的中斷號,調用功能 MOV AH,4CH ;返回DOS係統 INT 21H CODES ENDS END START
輸出結果為:
二.輸入輸出單個字符
下麵是調用2號功能輸出單個字符"a"和調用1號功能輸入單個字符的代碼。
DATAS SEGMENT ;此處輸入數據段代碼 Input DB 13,10,'Please input:',13,10,'$' DATAS ENDS CODES SEGMENT ASSUME CS:CODES,DS:DATAS START: MOV AX,DATAS MOV DS,AX ;數據放入DS MOV DL,'a' ;字符存入寄存器 MOV AH,02H ;調用2號功能輸出單個字符 INT 21H ;INT 21H調用功能 ;調用9號功能輸出字符串"請輸入" LEA DX,Input MOV AH,9 INT 21H MOV AH,01H ;調用1號功能輸入字符(隻能輸入一個字符) INT 21H MOV AH,4CH ;返回DOS係統 INT 21H CODES ENDS END START
輸出結果為:
三.輸出4位數字
在做匯編實驗時,總是遇到一個問題,不會輸出一串數字如:2030.(8位最大5位數)
下麵就是輸出一串數字的代碼,這裏采用的方法是(必須是4位數字)
1.先除以1000.2030/1000=2(商)..30(餘)判斷商是否為0,不為0輸出;
2.輸出玩千位2後,商賦值給寄存器接著跳轉到判斷百位;
3.這裏重點是設置了一個判斷變量Nozero,如果這裏是3/1000=0(商)..3(餘),為0就判斷該變量是否為0,為0表示它小於1000,不輸出0,否則會輸出0003.而當數字第一位不為0時(如2030第一位是2,不為0)就令變量Nozero=1,後麵要輸出的0都是在數字中顯示輸出.(如2000,當輸出2時,Nozero=1,餘數為0,後麵的0均輸出.而30隻會到十位Nozero才賦值為1,輸出個位的0).
4.依次判斷十位,個位.
DATAS SEGMENT ;變量A和B為0-9999的無符號整數 A DW 2030 ;變量A Num DW ? Nozero DW ? ;添加一個判斷標誌變量 DATAS ENDS CODES SEGMENT ASSUME CS:CODES,DS:DATAS START: ;------------------------------------------------------------------------- MOV AX,DATAS MOV DS,AX ;16位出發在DX:AX一對寄存器中 MOV AX,A MOV Nozero,0 ;like a boolean variable ;------------------------------------------------------------------------- ;輸出千位 Output0: ;輸出數字 A存入AX中 XOR DX,DX MOV Num,1000 DIV Num MOV BX,AX ;商AX MOV CX,DX ;餘數DX CMP BX,0 JNE OutputNum0 ;商AX=!0 輸出數字 ;重點:添加該判斷防止0不能輸出 CMP Nozero,0 ;變量Nozero!=0輸出數字0 JNE OutputNum0 ;相當於0003前麵3個0過濾 2000後麵3個0顯示 ;------------------------------------------------------------------------- ;輸出百位 Output1: MOV AX,CX ;DX:AX 餘數CX賦值至AX XOR DX,DX MOV Num,100 DIV Num MOV BX,AX ;商AX MOV CX,DX ;餘數DX CMP BX,0 JNE OutputNum1 CMP Nozero,0 JNE OutputNum1 ;------------------------------------------------------------------------- ;輸出十位 Output2: MOV AX,CX ;DX:AX CX賦值至AX XOR DX,DX MOV Num,10 DIV Num MOV BX,AX ;商AX MOV CX,DX ;餘數DX CMP BX,0 JNE OutputNum2 CMP Nozero,0 JNE OutputNum2 ;------------------------------------------------------------------------- ;輸出個位 Output3: MOV AX,CX ;DX:AX CX賦值至AX XOR DX,DX MOV Num,10 DIV Num ADD DX,30H ;餘數DX MOV AH,2 INT 21H ;退出程序 JMP Exit ;------------------------------------------------------------------------- OutputNum0: ;程序輸出數字 MOV Nozero,1 ;標誌變量賦值為1 ADD BX,30H ;數字加30H為ASC碼數字 MOV DX,BX ;必須賦值到DX來調用中斷,否則會報錯 MOV AH,2 ;調用2號功能輸出字符 INT 21H JMP Output1 ;------------------------------------------------------------------------- OutputNum1: ;程序輸出數字 MOV Nozero,1 ;標誌變量賦值為1 ADD BX,30H ;數字加30H為ASC碼數字 MOV DX,BX ;必須賦值到DX來調用中斷,否則會報錯 MOV AH,2 ;調用2號功能輸出字符 INT 21H JMP Output2 ;------------------------------------------------------------------------- OutputNum2: ;程序輸出數字 MOV Nozero,1 ;標誌變量賦值為1 ADD BX,30H ;數字加30H為ASC碼數字 MOV DX,BX ;必須賦值到DX來調用中斷,否則會報錯 MOV AH,2 ;調用2號功能輸出字符 INT 21H JMP Output3 ;------------------------------------------------------------------------- Exit: ;程序結束模板:使用AH來選擇功能,其中4CH功能讓你退出程序 MOV AH,4CH INT 21H ;------------------------------------------------------------------------- CODES ENDS END START
輸出的結果是:而當A賦值為3會輸出相應的3而不是0003.
此方法似乎很笨拙,輸出數字每次都是書寫了4遍重複的輸出代碼,而且來回的跳轉,但是更重要的是提供一個Nozero的思想,在C、C++、C#、Java中常用到的設置bool型變量的方法在匯編程序中同樣有用並好用.在實驗中我也采用的是下麵的定義子程序方法輸出數字.
四.采用函數輸出4位數字
下麵是百度知道裏麵的一種方法,調用函數輸出數字的方法,由於還沒有學到子函數,所以這裏沒有驗證該方法,但感覺此方法還是相當有用的一種方法.上麵設置的Nozero也是參照了它的思想.僅供大家學習.網址:https://zhidao.baidu.com/question/54461195.html
outd proc push cx mov nozero,0 ;like a boolean variable mov cx, 10000 call decdiv mov cx, 1000 call decdiv mov cx, 100 call decdiv mov cx, 10 call decdiv mov cx, 1 call decdiv ;cmp nozero, 0 ;jne outdexit ;mov dl, 30h ;mov ah, 2 ;int 21h outdexit: pop cx ret ;call: 被除數在bx傳入,除數在cx傳入 ;ret: 打印商,餘數送bx decdiv proc mov ax, bx mov dx, 0 div cx mov bx, dx mov dl, al cmp dl, 0 jne dispdigit cmp nozero, 0 jne dispdigit jmp decdivexit dispdigit: mov nozero, 1 add dl, 30h mov ah, 2 int 21h decdivexit: ret decdiv endp outd endp
五.總結
最後,上麵的文章主要是給剛學習匯編的同學參考,大神略過.同時,代碼也不是很優化,比較冗餘,但它還是提供了一些很好的匯編思想供大家學習,希望大家能學到一些思想.反正對我剛學習匯編的此時,上麵4個代碼還是非常有用的.
由於剛學習發表博客,可能內容和格式不是很好,還請海涵! By: Eastmount
最後更新:2017-04-03 20:51:32