字符串的输入与显示(汇编程序)

汇编临近考试,虽然只是考察科目,但学了的东西不能白学,就把自己复习的东西拿出来,以后要回顾也方便


方法一:通过02号单个字符的输出功能,循环输出得到字符串

data segment
strs db "please input a string:$"
buf db 20
	db ?
	db 20 dup(?)
crlf db 0ah,0dh,'$'
data ends
stacks segment
stack db 200 dup(?)
stacks ends
codes segment
	assume cs:codes,ds:data,ss:stacks
start:
mov ax,data
mov ds,ax
lea dx,strs
mov ah,9;输出功能入口在dx
int 21h
mov ah,10;输入功能入口在dx
lea dx,buf
int 21h
lea dx,crlf
mov ah,9
int 21h
mov cl,buf+1;cl中放置实际字符串长度
;注意,buf+1->cl,并不是把地址给cl,buf+1只是一种寻址方式
;结果是cl中存放的是内存buf+1的实际内容
lea si,buf+2;si源变址寄存器指向串真正开始的地方
call print;注意,如果用jmp指令,子程序的ret就会返回到start最开始
mov ah,4ch
int 21h
print:
mov dl,[si];
mov ah,2;单个字符输出入口在dl
int 21h
inc si
dec cl
jnz print
ret
codes ends
end start

单步调试的时候,发现jmp,call指令的差别,

上网找资料查了一下:

jmp无条件跳转,指令本身无堆栈操作过程。所以一开始若写成jmp print....ret,会返回最开始,因为无条件跳转时不会保留当前ip指针

call子程序调用指令,指令本身有堆栈操作过程。注意子程序最后要ret


方法二:通过09号字符串输出功能,输出字符串

data segment
strs db "please input a string:$"
buf db 20
	db ?
	db 20 dup(?)
crlf db 0ah,0dh,'$'
data ends
stacks segment
stack db 200 dup(?)
stacks ends
codes segment
	assume cs:codes,ds:data,ss:stacks
start:
mov ax,data
mov ds,ax
lea dx,strs
mov ah,9;输出功能入口在dx
int 21h
mov ah,10;输入功能入口在dx
lea dx,buf
int 21h
lea dx,crlf
mov ah,9
int 21h
mov al,buf+1;al中先放入字符串实际个数
add al,2;因为buf第一个字节放的是最大长度,第二个是实际长度
;只有2+串实际长度才是串的末尾,(因为需要在末尾加上结束符)
mov ah,0
mov si,ax
mov buf[si],24h;'$'==24h
lea dx,buf+2;
mov ah,9
int 21h
mov ah,4ch
int 21h
codes ends
end start



你可能感兴趣的:(汇编)