2013-06-02 2 views
0

я должен создать процедуру, которая принимает два аргумента: (на стеке):x86 Assembly - Как скопировать строку в локальную (стек) переменную?

  • 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 

Распечатайте его перед тем, как усложниться, после того как вы узнаете, что он может распечатать его, построить его до полной функции стека за один раз