1

我尝试编写一个获取字符串并将其复制到堆栈上的过程。

那是我的代码:

cpyStr proc
    mov bp, sp    
;   save the IP
    mov bx, sp
;   copy the counter loop
    mov cx, [bp+4]
;   make local variable - need 30 bytes
    sub sp, [bp+4] * 2; length is byte so duplicate for word ...
;   copy the string's offset
    mov si, [bp+2] ; offset to si
copy:
    sub bx, 2 ; next word
    mov ax, [si] ; store the character in ax
    mov [bp], ax ; copy to stack's currect word
;   to the next .. 
    add si, 1 ; go to next character
loop copy
;   print
    push bx ; send local string var as parameter for printStr
    call printStr 
;   return the IP
    push    bx
;   returtn to main ....
    ret 4 ; delete 2 parameters 
endp ; end

主要的:

start:
    mov ax,@DATA
    mov ds,ax
; print
    push strSize
    push offset string
    call cpyStr
; msg
    push offset passed
    call printStr
; end
    mov ah,4ch
    mov al,0
    int 21H
end start

数据段:

string  db "Heello$"
strSize dw  8
passed  db "Passed$"

由于某种原因,它没有成功处理。

4

3 回答 3

1

你至少有三个问题。

首先,您的复制从写入 [bp] 开始,覆盖函数的返回地址。您的堆栈缓冲区从 [sp] 开始。其次,向前遍历源缓冲区和向后遍历目标缓冲区,反转字符串。第三,您在目标缓冲区中跳转了 2 个字节,但在源缓冲区中仅跳转了 1 个字节。正确的代码应该或多或少像这样

    cpyStr proc
    mov bp, sp
    mov cx, [bp+4]
    sub sp, cx
    add cx, 1
    shr cx, 1
    mov si, [bp+2]
    mov bx, sp
copy:
    mov ax, [si]
    mov [bx], ax
    add bx, 2
    add si, 2
    loop copy

    push sp
    call printStr
    mov sp, bp
于 2012-06-08T22:18:09.270 回答
0

不应该是:string db "Hello", $在数据段中以及passed db "Passed", $

于 2012-06-07T18:39:55.483 回答
0

代码不应该是:

loop copy
mov sp, bx
pop sp           ;pop instead of push
call printStr

ret 4
endp
于 2012-06-08T22:03:30.610 回答