Консультация № 143688
12.09.2008, 00:00
0.00 руб.
0 6 2
Доброго времени суток,уважаемые эксперты! Только приступил к изучению Ассемблера (MASM32) и нуждаюсь в Вашей помощи.
Найти значение выражения: (a – d)/b + d при a=12; b=17; d=2110
Часть программы в приложении.
Благодарен Вам за помощь.

Приложение:
.686
.model flat, stdcall
.data
a dw 12;
b dw 17;
d dw 2110;
rez dw ?;
.code
start:
mov ax,a
sub ax,d
mov dx,b
ret
end start

Обсуждение

Неизвестный
12.09.2008, 04:50
общий
это ответ
;Найти значение выражения: (a – d)/b + d при a=12; b=17; d=2110
;MASM32

.386
.model flat, stdcall

.data
a DD 12
b DD 17
d DD 2110

res DD ?

.code

;ВОЗВРАТ: eax = (@@a – @@d)/@@b + @@d
Get_Result PROC USES edx @@a:DWORD, @@b:DWORD, @@d:DWORD

mov eax,@@a
sub eax,@@d ;(@@a – @@d)

cdq ;преобразование двойного слова в учетверенное слово, копирует знаковый бит EAX на все биты EDX
idiv @@b ;/@@b

add eax,@@d ;+ @@d

ret
Get_Result ENDP

start:

push d
push b
push a
call Get_Result ;или invoke Get_Result, a,b,d

mov res,eax ;res:= (12 – 2110)/17 + 2110 = 1987

nop

;...
;выход из программы
;...



END start
Неизвестный
12.09.2008, 11:44
общий
это ответ
Здравствуйте, Alexkharkov!
Вот еще вариант более соответствующий masm32 - используются полезные макросы (отсюда и название masm )
Снабдил кое-какими пояснениями, если не понятно что будет - пишите

Приложение:
; (a – d)/b + d при a=12; b=17; d=2110
.486
.model flat, stdcall
option casemap :none ; case sensitive

; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««

include \masm32\include\windows.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
include \masm32\macros\macros.asm
include \masm32\include\Fpu.inc

includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\Fpu.lib

.data
a db "12",0 ; текстовая запись чисел
b db "17",0
d db "2110",0

a_real dt 0 ; не обязательно - храним преобразованные в вещественные
b_real dt 0 ; можно было обойтись, но так проще и нагляднее
d_real dt 0

result db 32 dup(0) ; место для результата
res_title db "Результат",0 ; заголовок окна

.code
start:
invoke FpuAtoFL, ADDR a, ADDR a_real, DEST_MEM ; преобразовываем строку в вещественное
invoke FpuAtoFL, ADDR b, ADDR b_real, DEST_MEM
invoke FpuAtoFL, ADDR d, ADDR d_real, DEST_MEM

; вычитаем из преобразованного преобразованные и запоминаем в числовом процессоре
; см. Help -> FPU Lib Help -> Available Functions
; источник1 = вещественное, источник2 = вещественное, результат в сопроцессоре
; 3 параметр поэтому игнорируется
invoke FpuSub, ADDR a_real, ADDR d_real, 0, SRC1_REAL or SRC2_REAL or DEST_FPU
; Эти аналогчно, но результат предыдущего в сопроцессоре
invoke FpuDiv, 0, ADDR b_real, 0, SRC1_FPU or SRC2_REAL or DEST_FPU
invoke FpuAdd, 0, ADDR d_real, 0, SRC1_FPU or SRC2_REAL or DEST_FPU
; Преобразование результата в сопроцессоре в строку
; первый параметр игнорируется (в сопроцессоре источник),
; второй - сколько чисел после десятичной точки
; треий - куда сохранить
invoke FpuFLtoA, 0, 2, ADDR result, SRC1_FPU or SRC2_DIMM

; это тривально, можно было и с print сделать, но тогда нужно будет организовывать задержку
invoke MessageBox, 0, ADDR result, ADDR res_title, MB_OK
exit

; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««

end start
Неизвестный
12.09.2008, 19:44
общий
мы ещё макросы не проходили. Это всего 2 лабораторная работа. Если можете, допишите пожалуйста мою программу в приложении. Спасибо.
Неизвестный
12.09.2008, 23:12
общий
Таки Trulala Вам и написал все. Но только там результат целочисленный, а дал вариант, чтобы показать, как легко, используя макросы, работать с вещественными числами в masm32
В его процедуре Get_Result и есть решение задачи. Или не понятно что в его решении?
Неизвестный
13.09.2008, 11:37
общий
Не понятно как получить дробную часть результата.
Неизвестный
13.09.2008, 13:25
общий
Поверьте, проще всего действовать именно так, как я написал - через макросы.
Или искусственно:
Чтобы получить десятые и сотые доли, исходное число умножайте на 100 и работайте как с целыми числами (как в примере Trulala), но перед выводом двух последних цифр, выведите десятичную точку
Форма ответа