匯編基礎知識之輸入輸出
最近在學習匯編程序,但輸入輸出是我遇到的第一個難題,這裏就簡單講訴一些匯編的基本輸出輸出字符串、字符、輸出數字等知識,僅供大家學習。這隻是一些基礎知識,匯編高手亦可以溫習一些基礎的輸入輸出知識.
一.輸出字符串
下麵是調用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