题目:从键盘输入一串字符串到缓冲区,要求第一行输出输入的字符串,第二行输出字符串的长度,第三行输出字符串的最后一个字符。
data segment
str1 db 0dh,0ah,'input:','$';
str2 db 0dh,0ah,'the number of string is:','$'
str3 db 0dh,0ah,'the last letter is:','$'
length db 0;
buf db 30;
db 0;
db 30 dup(24h);
data ends
code segment
assume cs:code,ds:data
start:mov ax,data;
mov ds,ax;
lea dx,buf; 输入字符串到缓冲区
mov ah,0ah;
int 21h;
lea dx,str1; 输出输入提示input:
mov ah,09h;
int 21h;
lea dx,buf+2; 输出缓冲区的字符串
mov ah,09h;
int 21h;
lea dx,str2; 输出输入提示the number of string is:
mov ah,09h;
int 21h;
lea si,buf+1;
mov dl,[si]; 输出字符串长度
mov length,dl; 输出字符串长度
CALL PRINT ;调用子程序
mov cl,length;
xor ch,ch;
lea dx,str3; 输出输入提示the last letter is:
mov ah,09h;
int 21h;
lea si,buf+2; 获取字符串的首地址
x: mov dl,[si]; 取字符串里指针指向的字符
inc si; 指针加一
loop x; 根据CX判断是否循环
mov ah,02h;
int 21h;
done:mov ah,4ch;
int 21h;
;子程序输出
PRINT PROC NEAR
MOV DL,[SI]
MOV CX,1 ;计数,初始值为1
MOV BL,10 ;每次除10
FIRST:
MOV AH,0 ;余数清零
MOV AL,DL
DIV BL ;除10
PUSH AX ;进栈,其中AH为余数,AL为商
CMP AL,0 ;比较商是否为0
JLE SECOND
MOV DL,AL
INC CX
JMP FIRST
SECOND:
POP DX ;出栈,其中DH为余数,DL为商
XCHG DH,DL ;交换DH,DL,使余数存入DL
ADD DL,30H ;转为ASCII码
MOV AH,02H
INT 21H
LOOP SECOND
RET
code ends
end start