Assembly x86程序集-如何将字符串复制到本地(堆栈)变量中?
我必须创建一个接收两个参数的过程:(在堆栈上):Assembly x86程序集-如何将字符串复制到本地(堆栈)变量中?,assembly,dos,x86-16,Assembly,Dos,X86 16,我必须创建一个接收两个参数的过程:(在堆栈上): 一个字符串的开头-一个字节数组 绳子的长度 我必须创建一个局部变量,并将字符串复制到变量中 然后我试着把它打印出来。它不起作用 .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+
- 一个字符串的开头-一个字节数组
- 绳子的长度
.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
它打印一些“随机”值。你知道为什么吗?在复制过程中,你没有循环,你只是复制字符串的第一个字节 此外,您在此处使用2个字节进行复制:
mov ax, [si]
mov [di], ax
应该是:
mov al, [si]
mov [di], al
cmp al, 0
je finished
inc si
inc di
jmp loop
按下
bp
,第一个(最后一次按下)参数位于[bp+4]
<代码>[bp+2]是您的回信地址。。。哪些是随机字符的原因…对于你来说,在做大之前先从小开始可能更容易
然后,您可以在构建例程时进行调试
.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
在变得更复杂之前把它打印出来,然后一旦你知道它可以打印出来,一次一个阶段地把它构建成一个完整的堆栈函数
.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