Консультация № 178214
05.05.2010, 13:27
42.70 руб.
0 1 1
Здравствуйте, помогите дописать программу на МАSМе, нужно вывести результат арифметического выражения : (a+b)/(c+d). моя программа выводит правильный результат если ответ положительный , если же он отрицательный то получается неправильный ответ , и ещё отдельно нужно вывести остаток если не делится нацело...

Приложение:
.386
.model flat, stdcall

include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\masm32.lib

.data
Lab_Caption db "Lab8!",0
Print_Mask db "%d",0
Print_Mess DB "The result is: "
Print_Buff db 4 dup (" "),0
Chars_Number dw ?

a db 127
b db -27
k db -10
d db 15
rez dw ?



.code
main:
call AllocConsole
or EAX,EAX
jz fail

push offset Lab_Caption
call SetConsoleTitleA
or EAX,EAX
jz fail
sub dx,dx
sub ax,ax
mov al,d
cbw
mov bx,ax
mov al,k
cbw
add bx,ax ;bx=c+d
mov al,a
cbw
mov cx,ax
mov al,b
cbw
add ax,cx ; ax=a+b
cmp bx,0
je label1
idiv bx
cbw
add rez,ax
label1 :
push DWORD ptr rez
push offset Print_Mask
push offset Print_Buff
call wsprintf
add SP,12


push -11
call GetStdHandle

push 0
push offset Chars_Number
push 19
push offset Print_Mess
push EAX
call WriteConsoleA

push -10
call GetStdHandle


push 0
push offset Chars_Number
push 1
push offset Print_Buff
push EAX
call ReadConsoleA


fail:
push 0
call ExitProcess

end main

Обсуждение

давно
Посетитель
7438
7205
06.05.2010, 13:25
общий
это ответ
Здравствуйте, Faraon.
Ваша ошибка была в том, что формат "%d" подразумевает двойное слово! А не слово, как у Вас. Программы под Windows 32-битные!
Для формата short надо было использовать "%hd".
Кроме того, почему Вы не пользуетесь возможностями 32-битного процессора?
Например, можно было сделать (под 32-битные регистры, но можно так и с 16-битными) так:
Код:

movsx ebx, d
movsx eax, k
add ebx, eax
jz label1
movsx ecx, a
movsx eax, b
add eax, ecx
cdq
idiv ebx
И так далее... но это так, к слову...
Код:
.386
.model flat, stdcall

include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\masm32.lib

.data
Lab_Caption db "Lab8!",0
Print_Mask db "%hd",0 ;у нас слово, а не двойное слово!!!
Print_Mask2 db " %hd",0
Print_Mess DB "The result is: "
Print_Buff db 16 dup (0) ;увеличим буфер
Chars_Number dd ?

a db 127
b db -27
k db 10
d db -16
rez dw 0
tail dw 0

.code
main:
call AllocConsole
or EAX,EAX
jz fail

push offset Lab_Caption
call SetConsoleTitleA
or EAX,EAX
jz fail

sub dx,dx
sub ax,ax
mov al,d
cbw
mov bx,ax
mov al,k
cbw
add bx,ax ;bx=c+d
mov al,a
cbw
mov cx,ax
mov al,b
cbw
add ax,cx ;ax=a+b
cmp bx,0
je label1
idiv bx
cbw
mov rez,ax ;лучше так, а не add
mov tail,dx ;остаток

label1 :
push DWORD ptr rez
push offset Print_Mask
push offset Print_Buff
call wsprintf
add SP,12

cmp tail, 0 ;если остаток не 0, то добавим и его
je print_message

;вычислим адрес, куда запишем остаток
push offset Print_Mess
call lstrlen ;длина строки
add eax, offset Print_Mess

push DWORD ptr tail ;остаток, отделенный двумя пробелами
push offset Print_Mask2
push eax ;адрес
call wsprintf
add SP,12

print_message:
push -11
call GetStdHandle
mov esi, eax ;сохраним handle

push offset Print_Mess
call lstrlen ;считаем длину сообщения

push 0
push offset Chars_Number
push eax ;длина
push offset Print_Mess
push esi ;handle
call WriteConsoleA

push -10
call GetStdHandle

push 0
push offset Chars_Number
push 1
push offset Print_Buff
push EAX
call ReadConsoleA

fail:
push 0
call ExitProcess

end main
5
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Форма ответа