字符串输入通过调用DOS功能的0AH
号功能实现,需要用户指定一个输入缓冲区存放输入的字符串。缓冲区一般定在数据段,其定义格式如下
假设字符串缓冲区的偏移地址在DX中
字节位置 | 作用 | |
---|---|---|
[DX] | 第一个字节 | 用户定义的缓冲区长度 |
[DX + 1] | 第二个字节 | 实际输入的字符数(不包括回车), 由0AH号功能自动填入 |
[DX + 2] | 第三个字节 | DOS从该字节(第三个字节)开始存放输入的字符, 缓冲区的总长度 = 缓冲区长度 + 2 |
在调用该功能前, 应把输入缓冲区的起始偏移地址预置于DX
寄存器
字符串显示通过调用DOS功能的09H
号功能实现,该功能要求,被显示的字符串必须以 ‘$’ 结尾,如果想让显示的字符串换行, 则应在字符串结束加上回车和换行的ASCII码,0DH 和 0AH
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
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