字符串输入
字符串输入通过调用DOS功能的0AH
号功能实现,需要用户指定一个输入缓冲区存放输入的字符串。缓冲区一般定在数据段,其定义格式如下
假设字符串缓冲区的偏移地址在DX中
字节位置 | 作用 | |
---|---|---|
[DX] | 第一个字节 | 用户定义的缓冲区长度 |
[DX + 1] | 第二个字节 | 实际输入的字符数(不包括回车), 由0AH号功能自动填入 |
[DX + 2] | 第三个字节 | DOS从该字节(第三个字节)开始存放输入的字符, 缓冲区的总长度 = 缓冲区长度 + 2 |
在调用该功能前, 应把输入缓冲区的起始偏移地址预置于DX
寄存器
字符串显示
字符串显示通过调用DOS功能的09H
号功能实现,该功能要求,被显示的字符串必须以 ‘$’ 结尾,如果想让显示的字符串换行, 则应在字符串结束加上回车和换行的ASCII码,0DH 和 0AH
举例
- 显示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
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/122845.html