Массив как параметр функции в сборке 8086 - PullRequest
1 голос
/ 23 февраля 2011

Я хочу передать массив байтов (или указатель на этот массив) функции в сборке 8086.

Когда я пытаюсь PUSH указатель, это дает мне ошибку компиляции.Ошибка «Неправильные параметры».

org 100h

JMP Start  

Donnee DB 0ABh,0CDh,0EFh  

;; Principal program ;;
Start:

PUSH Donnee

CALL CalculeCRC  

POP CRC 

ret

Ответы [ 2 ]

2 голосов
/ 23 февраля 2011

Код операции PUSH ожидает значение DWORD либо в памяти, либо в регистре. В вашем случае вы пытаетесь выдвинуть массив из трех байтов. Я думаю, с технической точки зрения, это допустимый код, но ассемблер понимает, что это не совсем то, что вы хотели. (Возможно, будет интересно посмотреть, будет ли код собираться, если вы добавите еще один элемент в ваш массив байтов, но это не относится к делу).

В любом случае, то, что вы пытаетесь сделать, - это не то, чего вы хотите. Вы хотите поместить указатель на массив в стек перед вызовом своей функции, вы НЕ пытаетесь поместить весь массив в стек. Даже если ассемблер позволит вам, это будет очень плохо, потому что это будет пустая трата памяти. Чтобы сделать то, что вы хотите, вам нужно получить адрес вашего массива и поместить его в стек. Вы можете использовать LEA, чтобы получить «эффективный адрес» массива:

lea eax, Donnee
push eax

из вас могут сделать следующее:

push  OFFSET Donnee
0 голосов
/ 23 февраля 2011

Я, конечно, не эксперт в 8086, но я бы прочитал инструкцию PUSH, чтобы увидеть, что она действительно может сделать то, что вы ожидаете.

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

Возможно, что-то вроде этого:

lea  ax, Donnee
push ax

Здесь могут быть ошибки пунктуации и / или упорядочения аргументов;У меня нет под рукой ассемблера 8086.

...