编写程序,将字符串STRING1的内容复制到字符串STRING2中,要求由子程序来实现字符串的复制,并采用堆栈来传递参数。
最近刚好在学王爽的《汇编语言》,可以试着来回答一下,代码经masm 5.0调试通过。
assume cs:code,ds:data,ss:stack
stack segment
db 32 dup (0)
stack ends
data segment
db "welcome to masm!",0
db 32 dup (0)
data ends
code segment
start:
mov sp,stack ;初始化栈段。
mov ss,sp
mov sp,32
mov si,data ;ds:si、es:di分别指向要复制的字符串和目标字符串。
mov ds,si
mov es,si
mov si,0
mov di,17
mov bp,sp ;bp记录原来的栈顶,因为栈是空的,同时也是栈底。
push ds ;ds、si、es、di依次入栈。
push si
push es
push di
call copy_string ;调用复制字符串的子程序。
pop di ;di、es、si、ds依次出栈。
pop es
pop si
pop ds
mov ax,4c00h
int 21h
;-----------------------------------------------------------------------------------------------------------
;名称:copy_string
;功能:复制字符串,以0为结尾。
;参数:ds:si指向要复制的字符串,es:di指向目标字符串。
; 栈顶存放IP,后面依次存放di、es、si、ds,bp指向ds后面一个字单元,表示栈底。
;返回:无
copy_string:
push [bp-2] ;ds
push [bp-4] ;si
push [bp-6] ;es
push [bp-8] ;di
push cx
push bx
;sp指向栈顶,栈顶存放bx,从栈顶往下依次存放cx、di、es、si、ds、IP、......
mov si,[bp-2] ;ds
mov ds,si
mov si,[bp-4]
mov bx,0 ;bx记录字符串长度。
mov cx,0
;通过比较来找到0得到字符串长度。
cmp_0:
mov cl,ds:[si]
jcxz cmp_ok
inc bx ;如果不是0则bx+1,表示有一个字符。
inc si ;指向下一个内存单元继续比较。
jmp cmp_0
cmp_ok:
mov cx,bx ;记录字符串长度。
mov si,[bp-2] ;ds
mov ds,si
mov si,[bp-4]
mov di,[bp-6] ;es
mov ds,di
mov di,[bp-8]
;复制字符串。
copy_s:
mov bl,ds:[si]
mov es:[di],bl
inc si
inc di
loop copy_s
mov bl,0
mov es:[di],bl ;在复制的字符串后面加上0。
;还原用到的寄存器的值并返回。
pop bx
pop cx
pop di
pop es
pop si
pop ds
ret
;-----------------------------------------------------------------------------------------------------------
code ends
end start