汇编编写程序,实在不会写

 

编写程序,将字符串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