Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Условные/безусловные переходы 
:(
    Опции темы
bncom
Дата 17.3.2007, 13:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Задание: Если число состоит менее, чем из 3 десятичных цифр, сохранить их сумму, иначе сохранить 0. 

Тут как я понимаю надо использовать УСЛОЛОВИЯ, как в Си: if, else, т.е. ход действий такой: 

1) считаем кол-во разрядов (пример: 123) 
2) if >3 ? ->1+2+3=6 
3) else <3 -> 0

Можно и так:

1) DI = 0; 
2) Разделить число на 10, остаток прибавить к DI; 
3) Повторять 1 до получения нулевого частного и увеличивать счётчик; 
4) Если счётчик < 3, отправить в приёмник 0, иначе - значение DI. 

А вот как это на ассемблере написать... ?  smile 

P.S. Знаю, что надо воспользоваться командами cmp, jmp, je, ja, jbe и т.д. но я в них не силен ((

--------------------
"Мы никогда не живем, мы лишь надеемся, что будем жить." Вольтер 
PM MAIL   Вверх
10110111
Дата 17.3.2007, 15:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



вот...может, можно как-нибудь красивее...:
Код

mov ax,[Number]
xor bx,bx
cmp ax,999
jg SaveZero
mov ax,dx
xor dx,dx
mov cx,10
div cx
mov bx,dx    ;digit0
xor dx,dx
div cx
add bx,dx    ;digit0+digit1
add bx,ax    ;+digit3
SaveZero:

PS:
Цитата

менее, чем из 3 десятичных цифр

В смысле, менее или равно?

Это сообщение отредактировал(а) 10110111 - 17.3.2007, 15:57
PM MAIL   Вверх
bncom
Дата 17.3.2007, 16:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата
В смысле, менее или равно?
Я чего-то ступил, менее, т.е. получается так:

.......
2) if <3 ? ->1+2+3=6 
3) else >3  -> 0
--------------------
"Мы никогда не живем, мы лишь надеемся, что будем жить." Вольтер 
PM MAIL   Вверх
MAKCim
Дата 17.3.2007, 16:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

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



bncom, 
Цитата(bncom @  17.3.2007,  16:24 Найти цитируемый пост)
2) if <3 ? ->1+2+3=6 

если меньше 3-х, как у тебя 123 получилось?
Код

cmp eax, 100
cmovae eax, 0
xor edx, edx
mov ebx, 10
div ebx
add eax, edx



--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
bncom
Дата 18.3.2007, 12:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Да я вообще что-то торможу, извени меня...

Конечно, менее трех разрядов, т.е. например число 23, и тогда сохранить его сумму чисел, т.е. 2+3 = 5
--------------------
"Мы никогда не живем, мы лишь надеемся, что будем жить." Вольтер 
PM MAIL   Вверх
MAKCim
Дата 18.3.2007, 12:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

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



см выше


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
bncom
Дата 21.3.2007, 20:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Вот написал:

Код

.MODEL    SMALL

Sseg    SEGMENT STACK 'stack'
    DB 256 DUP (?)
Sseg    ENDS

;-------------------------------------------------- 
;                Область данных программы 
;-------------------------------------------------- 
Dseg    SEGMENT 'data'

X       DW       101D

Dseg    ENDS
Cseg    SEGMENT 'code'
    ASSUME CS:Cseg, DS:Dseg, SS:Sseg
;-------------------------------------------------- 
;                   Задание 
;-------------------------------------------------- 
ZADAN    PROC    NEAR    
    
    CMP    AX, X
    CMOVAE    AX, 0
    XOR    DX, DX
    MOV    DX, 10
    DIV    DX
    ADD    AX, DX    
    RET 
    
ZADAN    ENDP
;-------------------------------------------------- 
;                   Главная часть 
;--------------------------------------------------           

Main PROC FAR

    PUSH DS
    MOV AX, 0 
    PUSH AX 
    MOV AX, Dseg
    MOV DS, AX

    CALL ZADAN
    RET

Main ENDP
Cseg ENDS
END Main


Но: транслятор не понимает регистр EAX и т.п. Читал где-то, что нужно сделать, но забыл как...  
Подскажите пожалуйста.
Если прост озаменить регистры на AX, то транслятор выдает какую-то ошибку...
--------------------
"Мы никогда не живем, мы лишь надеемся, что будем жить." Вольтер 
PM MAIL   Вверх
MAKCim
Дата 21.3.2007, 20:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

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



bncom, 
странно, почему он автоматом префикс 66h не ставит


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
bncom
Дата 22.3.2007, 17:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Ну а что мне делать тогда?

Вообще программа правильно сделана?
--------------------
"Мы никогда не живем, мы лишь надеемся, что будем жить." Вольтер 
PM MAIL   Вверх
Kuvaldis
Дата 22.3.2007, 21:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


механик-вредитель
***


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

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



bncom, 
Цитата

Но: транслятор не понимает регистр EAX и т.п. Читал где-то, что нужно сделать, но забыл как...  
Подскажите пожалуйста.

поставь в начале программы .386


--------------------
Помни - когда ты спишь, враг не дремлет
Спи чаще и дольше, изматывай врага бессоницей
PM MAIL ICQ   Вверх
bncom
Дата 23.3.2007, 18:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



А что вообще за команда CMOVAE  ? Я ее нигде найти не могу (в справочниках).

Вот сделал как вы сказали - все равн оне работает (ошибки при трансляции):

Код

.386
.MODEL    SMALL ; 

Sseg    SEGMENT STACK 'stack'
    DB 256 DUP (?) ;
Sseg    ENDS

;-------------------------------------------------- 
;                Область данных программы 
;-------------------------------------------------- 
Dseg    SEGMENT 'data'

X       DW       101D

Dseg    ENDS
Cseg    SEGMENT 'code'
    ASSUME CS:Cseg, DS:Dseg, SS:Sseg
;-------------------------------------------------- 
;                   Задание 
;-------------------------------------------------- 
ZADAN    PROC    NEAR    
    
    CMP    EAX, X
    CMOVAE    EAX, 0
    XOR    EDX, EDX
    MOV    EDX, 10
    DIV    EDX
    ADD    EAX, EDX
    
    RET 
    
ZADAN    ENDP
;-------------------------------------------------- 
;                   Главная часть 
;--------------------------------------------------           

Main PROC FAR

    PUSH    DS 
    MOV    EAX, 0 
    PUSH    EAX 

    MOV    EAX, Dseg
    MOV    DS, EAX

    CALL ZADAN
    RET 

Main ENDP
Cseg ENDS
END Main

--------------------
"Мы никогда не живем, мы лишь надеемся, что будем жить." Вольтер 
PM MAIL   Вверх
JAPH
Дата 23.3.2007, 19:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Команда CMOVAE копирует источник в приёмник, если предыдущее сравнение дало результат Above or Equal (>=). Команда появилась в Pentium Pro, поэтому директивой .386 тут не обойтись. (Нужно что-то вроде .686, поправьте, если что)
Да, кстати: если программа пишется под DOS, то .model small должна стоять перед .386, иначе транслятор сгенерирует инструкции 32-битного режима, которые DOS не переваривает.
CMOVAE можно заменить:
Код

    CMP EAX, X
    JB  @1     ;Условие, противоположное AE
    MOV EAX, 0 ; XOR EAX, EAX
@1:  ;...


Мой взгляд на решение (единственное достоинство - без div):
Код

    TEST EAX, 0FFFFFF00h
    JZ   @1
    XOR  EAX, EAX
    RET
; А обязательно для 32битных чисел?
; Двузначные помещаются в один байт, и код выше для них не нужен
@1: AAM
    CMP  AH, 0Ah
    PUSH EBX ; И тогда здесь PUSH BX
    MOV  BL, AL
    DB   0D6h ; Для умных трансляторов SALC
    ADD  BL, AH
    AND  AL, BL
    CBW
    POP  EBX ; И POP BX и вовсе не нужна .386
    RET


Это сообщение отредактировал(а) JAPH - 23.3.2007, 19:29


--------------------
Что непонятно - спрашиваем smile
PM MAIL ICQ   Вверх
MAKCim
Дата 23.3.2007, 20:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

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



bncom, 
извини, сам ошибся
возможные операнды CMOVxx - память, регистр, но не непосредственный операнд
так что делай как сказал JAPH, 


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

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

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

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


 




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


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

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