閱讀324 返回首頁    go 阿裏雲 go 技術社區[雲棲]


匯編基礎知識之輸入輸出

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

一.輸出字符串

下麵是調用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

  上一篇:go FreeMarker簡介及插件安裝
  下一篇:go TELNET與MSTSC命令的區別