2012-04-14 4 views
0

Привет, я делаю DES в ассемблере 8086, и у меня много массивов, также мне нужны некоторые процедуры, но я не знаю, как отправить массив в процедуру. Я попытался использовать стек, но это не сработало. Можешь дать мне руку? Я использую TASMКак отправить массив на процедуру

ответ

2

Скажем у вас есть массив слов, определенных как:

myArray dw 10, 9, 8, 7, 6, 5, 4, 3, 2, 1 
numItems dw 10 

И вы хотите передать, что к процедуре:

push myArray ; the address of the array 
mov ax, [numItems] 
push ax  ; the length of the array 
call myProc 
; if you want the caller to clean up ... 
add sp, 4 ; adjust sp to get rid of params 

Тогда MyProc будет:

myProc: 
    mov bp, sp ; save stack pointer 
    mov cx, [bp+4] ; cx gets the number of items 
    mov bx, [bp+6] ; bx gets the address of the array 
    ; at this point, you can address the array through [bx] 
    mov ax, [bx+0} ; first element of the array 
    mov ax, [bx+2] ; second element of the array 
    ret 4 ; cleans up the stack, removing the two words you'd pushed onto it 
    ; or, if you want the caller to clean up ... 
    ret 
+0

ОК, это полезно, спасибо. Но как насчет того, есть ли у меня два разных массива, и мне нужно, чтобы значения перемещения составляли один из них, и мне нужен другой индекс каждый раз, когда я перемещаю значение? Например, сначала переместите значение в положение 5, затем значение в позиции 20. Как я могу это сделать? Я просто нашел что-то вроде этого –

+0

@AlvaroFallas: Я предлагаю вам найти хороший учебник по ассемблеру. Язык ассемблера хорошо изучен. http://www.planetpdf.com/codecuts/pdfs/aoa.pdf –

+0

Мне жаль, что я сказал, что сделал что-то подобное, чтобы получить значение из разных позиций mov ax, byte ptr DS: [[bp + 6 ] + (bx * 2)] bp + 6 - адрес массива i need bx * 2 - это моя позиция. Но получите сообщение об ошибке «Режим Ilegal indexing» –