8086汇编语言(三) 字符串输入和显示

字符串输入

  字符串输入通过调用DOS功能的0AH号功能实现,需要用户指定一个输入缓冲区存放输入的字符串。缓冲区一般定在数据段,其定义格式如下
在这里插入图片描述
假设字符串缓冲区的偏移地址在DX中

字节位置 作用
[DX] 第一个字节 用户定义的缓冲区长度
[DX + 1] 第二个字节 实际输入的字符数(不包括回车), 由0AH号功能自动填入
[DX + 2] 第三个字节 DOS从该字节(第三个字节)开始存放输入的字符, 缓冲区的总长度 = 缓冲区长度 + 2

在调用该功能前, 应把输入缓冲区的起始偏移地址预置于DX寄存器

字符串显示

  字符串显示通过调用DOS功能的09H号功能实现,该功能要求,被显示的字符串必须以 ‘$’ 结尾,如果想让显示的字符串换行, 则应在字符串结束加上回车和换行的ASCII码,0DH0AH

举例

  • 显示Hello World
DATA SEGMENT WORD PUBLIC 'DATA'
    STRING DB 'Hellow, World!', 0DH, 0AH, '$'
DATA ENDS
EXTRA SEGMENT WORD PUBLIC 'EXTRA'
EXTRA ENDS
CODE SEGMENT WORD PUBLIC 'CODE'
	TERMINATE PROC
        MOV AH, 4CH
        INT 21H
    TERMINATE ENDP
    ASSUME CS:CODE, DS:DATA, ES:EXTRA
    START:
        MOV AX, DATA
        MOV DS, AX
        MOV AX, EXTRA
        MOV ES, AX
        MOV DX, OFFSET STRING
        MOV AH, 09H
        INT 21H
        CALL TERMINATE
CODE ENDS
    END START
  • 从键盘输入一个2个数字, 将它转变为一个十位数, 并再转换为字符, 输出
DATA SEGMENT WORD PUBLIC 'DATA'       
	ORG 00H    
    TEN DB 10D
    SUM DB 00H
DATA ENDS
STACK SEGMENT WORD PUBLIC 'STACK'
STACK ENDS
CODE SEGMENT WORD PUBLIC 'CODE'    
	INITIIALIZE PROC    	;用来初始化段寄存器的过程    
		MOV AX, STACK          
		MOV SS, AX              
		MOV AX, DATA        
		MOV DS, AX        
		RET    
	INITIIALIZE ENDP    
	TERMINATE PROC        	;用来退出程序的过程
		MOV AH, 4CH        
		INT 21H          	;因为程序直接退出, 可以不需要加RET
	RET    
	TERMINATE ENDP      
	PRINTLN PROC        	;换行的过程
		PUSH AX        		
		PUSH DX        		;过程中要用到这两个寄存器, 先把原来的值存到栈里
		MOV AH, 2        	;功能号2是字符显示
		MOV DL, 0DH        	;DL寄存器存放打印字符, 这里是0D是换行的意思
		INT 21H        		;中断操作, 进行打印字符
		MOV DL, 0AH        	;0A是光标指向第一个字符的意思
		INT 21H        		;中断操作
		POP DX        	
		POP AX        		;将原来的值再放回对应的寄存器
		RET    				;过程结束, 返回
	PRINTLN ENDP 
        
    NUMBER_OUTPUT MACRO NUMBER_ADDRESS
        PUSH AX
        PUSH BX
        PUSH CX
        PUSH DX
        MOV AX, [NUMBER_ADDRESS]
        XOR CX, CX
        DIVISION:
            IDIV [TEN] 
            XOR BX, BX
            MOV BL, AH
            ADD BL, 48
            PUSH BX   
            MOV AH, 0   
            INC CX
            CMP AX, 0  
            JNE DIVISION
        OUTPUT:
            XOR AX, AX
            POP AX
            MOV DX, AX   
            MOV AH, 2
            INT 21H
            LOOP OUTPUT
        POP DX
        POP CX
        POP BX
        POP AX
    ENDM
                   
    ASSUME CS:CODE, SS:STACK, DS:DATA        
	START:            
		CALL INITIIALIZE
		;输入数字字符转变为数值存入栈            	
        XOR CX, CX
        XOR DX, DX
        MOV CX, 0
        CMP CX, 1   ;ZF = 0
    AGAIN:      ;输入    
        MOV AH, 1
        INT 21H
        SUB AL, 48   
        MOV AH, 0
        PUSH AX
        INC CX
        CMP CX, 2
        JNE AGAIN
        ;将栈中的数值整体变成一个数值
        MOV DX, CX
        XOR BX, BX
        XOR CX, CX
    A:
        POP AX
        MOV BX, CX
        XOR CX, CX
        CMP CX, 0
        B:              
            CMP CX, BX
            JE DOWN   ;CX == BX
            MUL [TEN]
            INC CX
        JMP B
        DOWN:
            PUSH BX
            MOV BX, OFFSET SUM
            ADD [BX], AX
            POP BX
            INC CX       
            CMP CX, DX
        JE SHUT ;CX == DX
    JMP A
        SHUT:            
            CALL PRINTLN
            LEA SI, SUM   
            ;将数值转变为数字字符并输出
            NUMBER_OUTPUT SI
        CALL TERMINATE
CODE ENDS        
	END START

你可能感兴趣的:(汇编语言,嵌入式,嵌入式硬件)