Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Арифметические действия 
:(
    Опции темы
galileopro
Дата 28.9.2009, 22:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 7.6.2009
Где: Харьков

Репутация: нет
Всего: нет



Нужно вычислить такое выражение y=(b+4d-123)/(1-a/2) под МАСМ.
Вот код, но работает некорректно. Где ошибка?
Код
.386
.model  flat, stdcall
option  casemap:none
Sleep     proto :DWORD
ExitProcess     proto :DWORD
GetStdHandle    proto :DWORD
WriteConsoleA   proto :DWORD,:DWORD,:DWORD,:DWORD,:DWORD
ReadConsoleA proto :DWORD,:DWORD,:DWORD,:DWORD,:DWORD
includelib      C:\masm32\lib\kernel32.lib
.data
        stdout   DWORD ?
        msg      BYTE "Anything",0dh,0ah
        cWritten DWORD ?
        Buffer  BYTE 128 DUP(?)
 d DWORD 20
 b DWORD 20
 a BYTE 4 
.code
main:
 invoke  GetStdHandle, -11
 mov stdout, eax
 
;(b+4d-123)/(1-a/2)
mov eax, d
sal eax, 2 
add eax, b
sub eax, 123
mov ebx, eax
mov al, a
sar al, 1
neg al
inc al
cbw
mov bx, ax
mov eax, ebx
div bx ;результат хранится в регистре eax

cmp eax, 0
jg m1
neg eax
m1:

;начало вывода на экран 
        mov esi, offset msg
        mov ebx, 10
        xor ecx, ecx
output:
 
        cdq                     ; делиться будет edx:eax, поэтому расширяем eax в edx
        div ebx                 ; разделить на 2 остаток при этом будет в edx
        add dl,'0'              ; делаем символ
        push edx                ; но выводить его пока нельзя
        inc ecx                 ; увеличиваем счетчик кол-ва символов в создаваемой строке
        test eax,eax    ; если не все
        jnz output              ; то повторяем
        
        mov edx,ecx             ; копируем кол-во символов
@@:
        pop eax                 ; восстанавливаем символ
        mov [esi],al    ; записываем его в строку msg
        inc esi                 ; увеличиваем указатель
        loop @b                 ; повторяем сколько нужно
        
        invoke WriteConsoleA, stdout, ADDR msg, edx, ADDR cWritten, 0
        invoke Sleep, 4000
        invoke ExitProcess, 0     
end main

PM MAIL WWW ICQ   Вверх
Goodwin98
Дата 28.9.2009, 23:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 41
Регистрация: 1.7.2009
Где: Deeptown

Репутация: 4
Всего: 5



А если так: smile 
Код

.386
.model  flat, stdcall
option  casemap:none
Sleep     proto :DWORD
ExitProcess     proto :DWORD
GetStdHandle    proto :DWORD
WriteConsoleA   proto :DWORD,:DWORD,:DWORD,:DWORD,:DWORD
ReadConsoleA proto :DWORD,:DWORD,:DWORD,:DWORD,:DWORD
includelib      \masm32\lib\kernel32.lib
.data
        stdout   DWORD ?
        msg      BYTE "Anything",0dh,0ah
        cWritten DWORD ?
        Buffer  BYTE 128 DUP(?)
 d DWORD 20
 b DWORD 20
 a BYTE 4
.code
main:
 invoke  GetStdHandle, -11
 mov stdout, eax
 
;(b+4d-123)/(1-a/2)
mov eax, d
sal eax, 2 
add eax, b
sub eax, 123
mov ebx, eax
mov al, a
sar al, 1
neg al
inc al

movsx ecx, al
mov eax, ebx
cdq
idiv ecx ;результат хранится в регистре eax

m1:
neg eax
js m1

;начало вывода на экран 
        mov esi, offset msg
        mov ebx, 10
        xor ecx, ecx
output:
 
        cdq                     ; делиться будет edx:eax, поэтому расширяем eax в edx
        div ebx                 ; разделить на 2 остаток при этом будет в edx
        add dl,'0'              ; делаем символ
        push edx                ; но выводить его пока нельзя
        inc ecx                 ; увеличиваем счетчик кол-ва символов в создаваемой строке
        test eax,eax    ; если не все
        jnz output              ; то повторяем
        
        mov edx,ecx             ; копируем кол-во символов
@@:
        pop eax                 ; восстанавливаем символ
        mov [esi],al    ; записываем его в строку msg
        inc esi                 ; увеличиваем указатель
        loop @b                 ; повторяем сколько нужно
        
        invoke WriteConsoleA, stdout, ADDR msg, edx, ADDR cWritten, 0
        invoke Sleep, 4000
        invoke ExitProcess, 0     
end main


Это сообщение отредактировал(а) Goodwin98 - 29.9.2009, 00:15
PM MAIL ICQ   Вверх
galileopro
Дата 29.9.2009, 07:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 7.6.2009
Где: Харьков

Репутация: нет
Всего: нет



Спасибо
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Asm для начинающих"
MAKCim
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой КОД.
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Asm для начинающих | Следующая тема »


 




[ Время генерации скрипта: 0.0376 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.