Перенос параметров через стек - Assembler

Узнай цену своей работы

Формулировка задачи:

Доброго времени суток . Даны два массива , заменить элемент массива кратный 5 на первый элемент ;
.586
 
.model flat,stdcall
 
extern ExitProcess@4:near
 
includelib c:\masm32\lib\user32.lib
includelib C:\masm32\lib\kernel32.lib
 
data segment
 
X DW 1,2,3,4,5
Y DW -1,2,14,10
F DB 5
 
data ends
 
text segment
start:
 
  MOV AX,5
  PUSH AX
  LEA EAX,X
  PUSH EAX
  CALL LOL

  MOV AX,4
  PUSH AX
  LEA EAX,Y
  PUSH EAX
  CALL LOL

 push 0
call ExitProcess@4
 
  LOL PROC
  PUSH CX
  PUSH EBX
  MOV DL , BYTE PTR[EBX]
 
  H1:MOV AL,BYTE PTR[EBX]
     MOV AH,0
     IDIV F 
     CMP AH,0
     JNE G1
     MOV BYTE PTR[EBX],DL
     G1:INC EBX
 
    LOOP H1
    POP EBX
    POP CX
 
 RET 
 
LOL ENDP
   
text ends
end start
Передачу параметров через регистры я смог сделать ; вопрос в том , как сделать выполнить эту программу , используя стек ?
Хотя , нет , проверьте ,пожалуйста :
.586
 
.model flat,stdcall
 
extern ExitProcess@4:near
 
includelib c:\masm32\lib\user32.lib
includelib C:\masm32\lib\kernel32.lib
 
data segment
 
X DW 1,2,3,4,5
Y DW -1,2,14,10
F DB 5
 
data ends
 
text segment
start:
 
MOV AX,5
PUSH AX
LEA EAX ,X
PUSH EAX
CALL LOL 
 
MOV AX, 4
PUSH AX
LEA EAX,Y
PUSH EAX
CALL LOL

push 0
call ExitProcess@4
 
LOL PROC
PUSH EBP
MOV EBP,ESP
MOV CX,[EBP+12]
MOV EBX,[EBP+8]
 
MOV DX,WORD PTR[EBX]
 
H1:MOV AX,WORD PTR[EBX]
IDIV F
CMP AH,0
JNE G1
MOV WORD PTR[EBX],DX
G1:ADD EBX,2
 
LOOP H1
 
POP EBP
RET
 
LOL ENDP

text ends
end start
Правильно ли я понял , что это передача через стек , и в этой строчке
MOV AX,WORD PTR[EBX]
IDIV F
CMP AH,0
возможно ли обойтись без регистра для проверки кратности ?

Решение задачи: «Перенос параметров через стек»

textual
Листинг программы
MOV EAX, 4
PUSH EAX
LEA EAX,Y
PUSH EAX
CALL LOL

Объяснение кода листинга программы

  1. MOV EAX, 4 - выполняет перенос значения 4 в регистр EAX
  2. PUSH EAX - отправляет значение регистра EAX в стек
  3. LEA EAX,Y - выполняет линковую команду, которая скорее всего указывает на переменную Y в памяти компьютера
  4. PUSH EAX - отправляет значение регистра EAX в стек
  5. CALL LOL - выполняет вызов функции с именем LOL, которая скорее всего находится в другом месте памяти компьютера Возможно, данный код выполняет перенос параметров в стек для последующего вызова функции, но без дополнительной информации сложно дать точный ответ.

Оцени полезность:

6   голосов , оценка 3.5 из 5