Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RusFAQ.ru: программирование на языке Assembler


РАССЫЛКИ ПОРТАЛА RUSFAQ.RU

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / Assembler

Выпуск № 446
от 12.05.2006, 18:35

Администратор:Калашников О.А.
В рассылке:Подписчиков: 328, Экспертов: 24
В номере:Вопросов: 2, Ответов: 4


Вопрос № 42356: Здравствуйте, мне требуется исходник программы которая позволяет ввести два числа десятичных, сложить их и вывести сумму на экран в десятичном виде, приложение консолное на TASM. Прошу не показывать схожие программы ибо я не знаю особенности ассембле...
Вопрос № 42378: Прошу прощения может быть это тупой вопрос, но я к сожалению совсем новичок в ассемблере. Нужно вычислить результат выражения a – b / (c + d * 2), используя регистры AX, BX, CX и DX. Значения переменных могут быть любыми, но среди ...

Вопрос № 42.356
Здравствуйте, мне требуется исходник программы которая позволяет ввести два числа десятичных, сложить их и вывести сумму на экран в десятичном виде, приложение консолное на TASM. Прошу не показывать схожие программы ибо я не знаю особенности ассемблера в виндоуз. Благодарю
Отправлен: 07.05.2006, 13:29
Вопрос задал: Daniil (статус: Посетитель)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: mix_mix
Здравствуйте, Daniil!
Создаете консоль FreeConsole+AllocConsole, функцией ReadConsole читаете числа, например, в формате "10 20", т.к. вы знаете особенности ассемблера, то Вам не составит труда разбить СТРОКУ на сост. части по пробелу, переконвертировать строку в число, затем сложить со вторым числом, перевести число в строку (хотя здесь можно использовать функцию wsprintf), вывести строку в консоль функцией WriteConsole.
З.Ы. Если Вам влом преобразовывать строки, то обратите внимание на функции atoi, _itoa и _splitpath из ntdll.dll
Ответ отправил: mix_mix (статус: 3-ий класс)
Ответ отправлен: 07.05.2006, 17:31

Отвечает: Пан Павел Константинович
Здравствуйте, Daniil!

1. Программа была специально не оптимезирована ибо она служит для ознакомительных целях.
2. Подход для решения задачи был выбран по принцепу "Что первым пришло в голову то и считать лучшим".
3. Программа не использует редких и узкоспец-ых инструкций.
4. Под Формулой (A+B) = C надо понимать что переменые A, B и C имеют тип Unsigned int.

Для справки:
Unsigned int (16 бит) = числовое множество [0..65535]

С, Уважением MnEm0n!C.

Приложение:

---------
Hello Worlds

Ответ отправил: Пан Павел Константинович (статус: 7-ой класс)
Ответ отправлен: 08.05.2006, 02:22


Вопрос № 42.378
Прошу прощения может быть это тупой вопрос, но я к сожалению совсем
новичок в ассемблере.
Нужно вычислить результат выражения a – b / (c + d * 2), используя
регистры AX, BX, CX и DX. Значения переменных могут быть любыми, но среди
них должны быть как положительные, так и отрицательные числа. Значения
переменных должны находится в тексте программы, при смене значений проводить повторную компиляцию.
Заранее всем огромное спасибо. Помогите кто может.
Отправлен: 07.05.2006, 17:00
Вопрос задал: Dimik (статус: Посетитель)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 2)

Отвечает: mix_mix
Здравствуйте, Dimik!
AX = a, BX = b и т.д. (хотя лучше будет поменять местами a и b, т.к. этим можно извавится от инструкции xchg)

Приложение:

Ответ отправил: mix_mix (статус: 3-ий класс)
Ответ отправлен: 07.05.2006, 17:22

Отвечает: Пан Павел Константинович
Здравствуйте, Dimik!

Извените что я использовал 8-ые регистры, опомнался поздно. НО! на основе этого примера можно сделать и с 16-ми регистрами, просто заменив <cl> на <cx> т.е. заменить 8-ые регистры на 16-ые. И ещё надо заменить инструкцию cbw на cwd.
Когда вы сделаете код с 16-ми регисрами вы поймёте, что с 8-ми регисрами код более элегантней.

CSEG segment
assume cs:CSEG,ds:CSEG,ss:CSEG,es:CSEG
org 100h
Begin:
;======================================
;a - b / (c + d * 2)
;a - b / (c + (d + d))
;f = (d + d)
;a - b / (c + f)
;======================================
mov ah,-2 ;d = -2
mov cl,-2 ;c = -2

add ah,ah ;f = d * 2
add cl,ah ;c + f

mov ah,12 ;b = 12
mov al,0 ;a = 0
sub al,ah ;a - b
;======================================
cbw ;for signed (see manual)

idiv cl ;(a - b) / (c + f)

;
;Result: <al> = 2
;*************
ret ;exit
;======================================
CSEG ends
end Begin
С, Уважением MnEm0n!C.

---------
Hello Worlds
Ответ отправил: Пан Павел Константинович (статус: 7-ой класс)
Ответ отправлен: 08.05.2006, 04:23


Отправить вопрос экспертам этой рассылки

Приложение (если необходимо):

* Код программы, выдержки из закона и т.п. дополнение к вопросу.
Эта информация будет отображена в аналогичном окне как есть.

Обратите внимание!
Вопрос будет отправлен всем экспертам данной рассылки!

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала RusFAQ.ru, зайдите непосредственно на RusFAQ.ru.


Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.


© 2001-2006, Портал RusFAQ.ru, Россия, Москва.
Идея, дизайн, программирование: Калашников О.А.
Email: adm@rusfaq.ru, Тел.: +7 (926) 535-23-31
Авторские права | Реклама на портале
Версия системы: 4.32 от 03.05.2006
Яндекс Rambler's Top100

В избранное