2015-08-26 3 views
1

Я хочу использовать в своем коде что-то вроде этого:Объединить в макроассемблере

.data? 
my_macro_var db MAX_PATH DUP (?) 

.code 

mov esi, offset my_macro_var 
my_macro esi, "hello and bye" 

Для этого я создать этот макрос, но я получаю несколько ошибок, которые я не могу решить ..

my_macro macro reg, characters 
LOCAL v1,v2,v3 
LOCAL c1,c2,c3,c4,cTotal 

v1 TEXTEQU %(@SizeStr(<characters>)) -2 ;; -2 is for the double quote 
v2 textequ %(v1/4) 
v3 = 0 

;% echo @SubStr(<characters>, 2, 4) 

repeat v2  
    c1 Substr <characters>,v3,1 

    cTotal equ c1 
    mov dword ptr [reg+v3], cTotal 
    v3=v3+4 
endm 

endm 

Я хочу этот результат ..

mov dword ptr [esi+00d], 'lleh' 
mov dword ptr [esi+04d], 'na o' 
mov dword ptr [esi+08d], 'yb d' 
mov dword ptr [esi+12d], 'e' 

Это ошибка s, что я получаю:

Code.asm(14) : error A2090: positive value expected 
MacroLoop(1): iteration 1: Macro Called From 
my_macro(16): Macro Called From 
Code.asm(14): Main Line Code 
Code.asm(14) : error A2006: undefined symbol : a 
MacroLoop(4): iteration 1: Macro Called From 
my_macro(16): Macro Called From 
Code.asm(14): Main Line Code 
Code.asm(14) : error A2006: undefined symbol : l 
MacroLoop(4): iteration 2: Macro Called From 
my_macro(16): Macro Called From 
Code.asm(14): Main Line Code 
Code.asm(14) : error A2006: undefined symbol : a 
MacroLoop(4): iteration 3: Macro Called From 
my_macro(16): Macro Called From 
Code.asm(14): Main Line Code 

Я думаю, что моя проблема будет решена, если я могу использовать зиЬзЬги и конкатенацию 4 переменных ...

+1

_ «но я получаю несколько ошибок, которые я не могу решить» _ Тогда вы должны перечислить эти ошибки в вашем вопросе. – Michael

ответ

2

Первой ошибка является вызвана тем, что SUBSTR использует один на основе индексирование, и вы пытаетесь использовать с ним нулевое индексирование. Остальные ошибки являются результатом cTotal, не имеющего символов кавычек.

Так, чтобы исправить ошибки, попробуйте следующее:

my_macro macro reg, characters 
LOCAL v1,v2,v3 
LOCAL c1,c2,c3,c4,cTotal 

v1 TEXTEQU %(@SizeStr(<characters>)) -2 ;; -2 is for the double quote 
v2 textequ %(v1/4) 
v3 = 0 

;% echo @SubStr(<characters>, 2, 4) 

repeat v2  
    c1 Substr <characters>, v3 + 1, 4 

    cTotal CATSTR <'>, c1, <'> 
    mov dword ptr [reg+v3], cTotal 
    v3=v3+4 
endm 

endm