2013-06-02 86 views
0

我要創建接收兩個參數的過程:(堆棧):x86程序集 - 如何將字符串複製到本地(堆棧)變量?

  • 串的offest - 一個字節數組。

  • 字符串的長度。

我必須創建一個局部變量,並將字符串複製到變量。

然後我試圖打印它。它不起作用。

.model small 
.stack 64 

.data 
str1 db "Hello world$" 
len dw $-str1 

.code 

print proc 
    push bp ; save bp 
    mov bp, sp 
    mov cx, [bp+4] 
    mov di, [bp+2] 
    mov ah, 02 
do1: 
    mov dl, ss:[si] 
    int 21H 
    inc si 
loop do1 
    pop bp 
    ret 4 
endp print 

cpy proc 
    mov bp, sp 
    mov si, [bp+2] ; string's offset 
    mov cx, [bp+4] ; string's length 
    sub sp, cx  ; create cx'th byte array 
    mov di, sp 
do: 
    mov ax, [si] 
    mov [di], ax 
    inc si 
    inc di 
loop do 
    add sp, [bp+4] ; restore stack 
    ; print 

    push len 
    push sp 
    call print 

    ret 4 
endp cpy 

start: 
    mov ax, @DATA 
    mov ds, ax 

    push len 
    push offset str1 
    call cpy 

    mov al, 0 
    mov ah, 4ch 
    int 21H 
end start 

它打印一些「隨機」值。你有什麼想法爲什麼?

回答

0

在你的複製過程中,你沒有循環,你只複製字符串的第一個字節。

而且你在這裏2個字節複製:

mov ax, [si] 
mov [di], ax 

應該是:

mov al, [si] 
mov [di], al 
cmp al, 0 
je finished 
inc si 
inc di 
jmp loop 
0

print proc 
    push bp ; save bp 
    mov bp, sp 
    mov cx, [bp+4] 
    mov di, [bp+2] 

已經被推bp,你的第一個(最後一個壓棧)參數是[bp + 4][bp + 2]是您的回覆地址......這佔了隨機字符...

0

可能會更容易讓你從小處着手在你走之前大

然後,你可以爲你打造了常規

調試
.data 
str1 db "Hello world$" 
.data1 

mov si,data  ;stringstart 
mov cx,data1-data ;stringlength 

do: 
    mov al, [si] 
    mov [di], al 
    inc si 
    inc di 
loop do 

在變得越來越複雜之前打印出來,然後一旦你知道它可以打印出來,一次構建一個完整的堆棧功能一個舞臺

相關問題