Вычисление выражения - Assembler (223181)

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

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

Здравствуйте, мне нужно составить программу, которая посчитает выражение r3 = b + c * a^2. Есть код, который считает r2 = a - b * 10 - c
.model small
.stack 100h
.data
    a DWORD 100
    b DWORD 4
    d DWORD 10
    r2 DWORD ?
.code
.386
main PROC
    mov ax, @data
    mov ds, ax
    mov ebx, a
    mov ecx, b
    mov edx, d
call EvaluationExpression
    mov r2, eax
    mov ax, 4C00h
    int 21h
main ENDP
EvaluationExpression PROC USES ebx ecx edx
CLC
    mov eax, ecx
    mov ecx, 10
    mul ecx
    mov ecx, eax
    mov eax, ebx
    sub eax, ecx
    sub eax, edx
ret
EvaluationExpression ENDP
end main
Я пытался его переделать под свой вариант, вот что получилось
.model small
.stack 100h
.data
    a DWORD 100
    b DWORD 4
    d DWORD 10
    r2 DWORD ?
.code
.386
main PROC
    mov ax, @data
    mov ds, ax
    mov ebx, a
    mov ecx, b
    mov edx, d
call EvaluationExpression
        mov r2, eax
        mov ax, 4C00h
        int 21h
main ENDP
EvaluationExpression PROC USES ebx ecx edx
CLC
    mov eax, ebx
    mul ebx
    mul edx
    mov ebx, eax
    add ebx, ecx
ret
EvaluationExpression ENDP
end main
И потом через codeview смотрел на регистр AX (там должен быть ответ), но не совпало с тем, что посчитал я. Буду рад если поможете. Спасибо

Решение задачи: «Вычисление выражения»

textual
Листинг программы
.model small
.stack 100h
.data
    av DWORD 100
    bv DWORD 4
    cv DWORD 10     ;cv, а не c - т.к. компилятор выдаёт ошибку компиляции
    r3 DWORD ?
.code
.386
main PROC
    mov ax, @data
    mov ds, ax
 
    mov ebx, av
    mov ecx, bv
    mov edx, cv
    call EvaluationExpression
    mov r3, eax
 
    mov ax, 4C00h
    int 21h
main ENDP
 
EvaluationExpression PROC USES ebx ecx edx
    mov esi, edx
    mov eax, ebx
    mul ebx     ;eax:=a^2
    mul esi     ;eax:=(a^2)*c
    add eax, ecx
    ret
EvaluationExpression ENDP
end main

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

  1. Создаётся программа с моделью small и размером стека 100h.
  2. В секции .data объявляются переменные:
    • av с значением DWORD 100,
    • bv с значением DWORD 4,
    • cv с значением DWORD 10,
    • r3, неинициализированной переменной типа DWORD.
  3. В секции .code указывается использование 386-ого набора команд.
  4. В процедуре main происходит следующее:
    • Копируется адрес сегмента данных в регистр ax.
    • Затем значение ax перемещается в регистр ds.
    • Значение переменных av, bv и cv загружаются в регистры ebx, ecx и edx соответственно.
    • Вызывается процедура EvaluationExpression.
    • Результат процедуры (значение в регистре eax) сохраняется в переменной r3.
    • Происходит выход из программы.
  5. Процедура EvaluationExpression принимает аргументы через стек:
    • Значение cv (в регистре edx) копируется в регистр esi.
    • Значение av перемещается в регистр eax.
    • Выполняется умножение eax на ebx (результат в eax - это квадрат av).
    • Умножается eax на esi (результат в eax).
    • К eax прибавляется значение ecx.
    • Производится возврат из процедуры с результатом в eax.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

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

15   голосов , оценка 3.933 из 5