Assembly 从参数复制到数组
我正在尝试将第2个参数复制到声明为:Assembly 从参数复制到数组,assembly,x86,nasm,Assembly,X86,Nasm,我正在尝试将第2个参数复制到声明为: .bss X:resb 20 我不知道该怎么做。以下是我的尝试: 参数以终止(0x0)字符结尾 %include "asm_io.inc" global asm_main section .data section .bss temp: resd 1 i: resd 1 X: resb 20 length: resd 1 ; length of input section .text asm_main: enter 0, 0
.bss X:resb 20
我不知道该怎么做。以下是我的尝试:
参数以终止(0x0)字符结尾
%include "asm_io.inc"
global asm_main
section .data
section .bss
temp: resd 1
i: resd 1
X: resb 20
length: resd 1 ; length of input
section .text
asm_main:
enter 0, 0
pusha
mov ebx, dword [ebp+12]
mov esi, dword [ebx+4]
loop: lodsb
; end of string?
or al, al
jz endloop
; copy arg[1] to x ================
mov temp, X ;error; temp = address of X
add temp, dword [i] ;error; temp += i
mov byte [temp], al ; ; temp[i] = al
add dword [i], 1 ; i++
; =================================
jmp loop
endloop:
popa
leave
ret
我认为我没有正确复制数组地址,它无法编译^
对于标记为的两行,错误是:“操作码和操作数的组合无效”。由于无法使用内存中的变量进行寻址,因此您的
temp
无效。您必须为它选择一个寄存器,例如,edi
。那么该块可能看起来像:
mov edi, X
add edi, [i]
mov [edi], al
mov esi, [ebp+12]
mov esi, [esi+4]
mov edi, X
loop:
lodsb
stosb
; end of string?
or al, al
jnz loop
这当然过于复杂了,初学者代码通常也是如此。更简单的版本可能如下所示:
mov edi, X
add edi, [i]
mov [edi], al
mov esi, [ebp+12]
mov esi, [esi+4]
mov edi, X
loop:
lodsb
stosb
; end of string?
or al, al
jnz loop
我真的不知道LODSB是怎么工作的
然后,您应该阅读有关它的说明集参考页。它使用
esi
和al
,但是您已经知道,否则为什么要将esi
与地址一起加载,并期望在al
中得到结果呢?ebp
根本没有初始化。如果你想使用它,你需要自己设置。我没有把所有的代码都放进去,如果你需要的话我可以。我已经检查过它是否有效,甚至打印出了论点。添加了剪断线。请参阅。另外,不会编译是一个糟糕的问题描述,您至少应该提供错误消息并标记相关行。这就是说,mov dword[temp],al
绝对是错误的,因为al
不是dword。我不确定你想用temp
做什么。对不起,我只是觉得我忽略了一件简单的事情。已编辑^x86不能同时为两个操作数占用内存。必须为mov
和add
的至少一个操作数使用寄存器。