我试图将第二个参数复制到声明为的数组:
.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
我不认为我正确地复制了数组地址,它不会编译^ 错误是:"操作码和操作数的无效组合"对于标有
的两行答案 0 :(得分:3)
由于您无法使用内存中的变量进行寻址,因此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
我真的不知道LODSB是如何工作的
然后,您应该阅读有关它的指令集参考页面。它使用esi
和al
,但您已经知道,为什么还要将esi
加载到地址并在al
中预期结果?