WMmail.ru - сервис почтовых рассылок

воскресенье, 20 ноября 2011 г.

RFpro.ru: Ассемблер? Это просто! Учимся программировать

 
Если выпуск не отображается, вы можете прочесть его на сайте Отказаться от рекламы
  
  
Долговой КРИЗИС в Европе - ВРЕМЯ ЗАРАБОТАТЬ на валютных курсах с Церих
  
  
  

  Мои подписки      Мои группы      Мои новости     
        Автор 
Калашников О.А.
      
  
Компьютеры и интернет   →   Софт   →   Программирование   →   RFpro.ru: Ассемблер? Это просто! Учимся программировать
  
RFpro.ru: Ассемблер? Это просто! Учимся программировать
 
 

Хостинг портала RFpro.ru:
Московский хостер
Профессиональный ХОСТИНГ на базе Linux x64 и Windows x64

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

Лучшие эксперты по данной тематике

Коцюрбенко Алексей aka Жерар
Статус: Профессор
Рейтинг: 2974
• повысить рейтинг »
Boriss
Статус: Академик
Рейтинг: 2548
• повысить рейтинг »
Абаянцев Юрий Леонидович aka Ayl
Статус: Профессионал
Рейтинг: 2116
• повысить рейтинг »

/ КОМПЬЮТЕРЫ И СОФТ / Программирование / Assembler (Ассемблер)

Номер выпуска:1491
Дата выхода:21.11.2011, 01:30
Администратор рассылки:Лысков Игорь Витальевич (Старший модератор)
Подписчиков / экспертов:190 / 61
Вопросов / ответов:1 / 1

Консультация # 184463: Уважаемые эксперты! Пожалуйста, помогите:надо сделать связи:паскаль-ассемблер,ассемблер паскаль,паскаль-паскаль,ассемблер-ассемблер. По задаче:Определить, есть ли в массиве L[1..N] значение, равное половине суммы минимального и максимального чисел (т.е. (min +max) / 2) и вывести номер первого значения, если такое число есть, иначе со...


Консультация # 184463:

Уважаемые эксперты! Пожалуйста, помогите:надо сделать связи:паскаль-ассемблер,ассемблер паскаль,паскаль-паскаль,ассемблер-ассемблер.
По задаче:Определить, есть ли в массиве L[1..N] значение,
равное половине суммы минимального и максимального чисел
(т.е. (min +max) / 2) и вывести номер первого значения,
если такое число есть, иначе сообщить, что таких значений не найдено.

Дата отправки: 16.11.2011, 00:52
Вопрос задал: Посетитель - 385565 (Посетитель)
Всего ответов: 1
Страница онлайн-консультации »


Консультирует Зенченко Константин Николаевич (Модератор):

Здравствуйте, Посетитель - 385565!

Проблема ответа на Ваш вопрос состоит в том, что полноценного транслятора, генерирующего OBJ-файлы нет. Компиляторы, которые я нашел в сети, сразу создают исполняемый файл без промежуточных.

Ниже смотрите код модуля на языке паскаль:

Код :
unit u184463; interface   const     sMass=10;{размер массива}   type     tMass=array[1..sMass]of integer;{тип массива}   procedure inp_pas(var a:tMass;b:integer);{описание подпрограммы ввода}   procedure job_pas(a:tMass;b:integer);{описание подпрограммы обработки} implementation   procedure inp_pas;{код подпрограммы ввода}     var i:integer;     begin       writeln;       writeln('Pascal module');{выводим тип модуля}       for i:=1 to b do         begin           write('Enter number [ ',i,' ]:=');{выводим сообщение}           read(a[ i ]);{вводим число}         end;     end;   procedure job_pas;{код подпрограммы обработки}     var i,i0,i1:integer;     begin       writeln;       writeln('Pascal module');{выводим тип модуля}       i0:=1;i1:=1;{минимальное и максимальное значение пока первое}       for i:=2 to b do         if a[ i ]>a[ i0 ]then i0:=i{новое максимальное значение}           else if a[ i ]<a[ i1 ]then i1:=i;{новое минимальное значение}       i:=(a[ i1 ]+a[ i0 ])div 2;{считаем задание}       i0:=0;       repeat         inc(i0);       until(a[ i0 ]=i)or(i0>b);{в цикле проверяем наличие нужного числа}       if a[ i0 ]=i then writeln('Yes, [ ',i0,' ]:=',a[ i0 ]){собщение о наличии числа в массиве}                  else writeln('No');{сообщение об отсутсвии нужного числа}     end; begin end.


Код модуля на языке ассемблера:
Код :
locals	@@ model large,pascal public inp_asm public job_asm code arg2	equ	4+2+2*0 arg1	equ	4+2+2*1 arg0	equ	4+2+2*2 argRet	equ	3*2 dbModule	db	10,13,10,13,'Assembler module$' dbEnter		db	10,13,'Enter number [ $' dbYes		db	10,13,'Yes, [ $' dbEqu		db	' ]:=$',10,13 dbNo		db	10,13,'No$',10,13 ;подпрограмма вывода строки-сообщения на экран out_Msg		proc 		push	ds 		push	cs 		pop	ds 		mov	ah,9 		int	21h 		pop	ds 		ret out_Msg		endp ;подпрограмма ввода числа в 10-ой системе inp_Num		proc ;сохраняем используемые регистры 		push	bx 		push	cx ;система счисления 		mov	bx,10 ;вводимое число 		xor	si,si ;ожданем любую клавишу с клавиатуры  @01:		xor	ax,ax 		int	16h ;проверяем клавишу ВВОД 		cmp	al,13 		jz	@@02 ;проверяем цифровые клавиши 		cmp	al,'0' 		jb	@@01 		cmp	al,'9' 		ja	@@01 ;цифровая клавиша- выводим на экран 		int	29h ;преобразовываем в число 		and	ax,0Fh ;обмениваем с результатом 		xchg	si,ax ;умножапем ранее веденное число на СС 		xor	dx,dx 		mul	bx ;суммируем результат 		add	si,ax 		jmp	short @@01 ;результат в аккумулятор  @02:		mov	ax,si ;востанавливаем использованные регистры и возврат 		pop	cx 		pop	bx 		ret inp_Num		endp ;подпрограмма вывода числа на экран out_Num		proc ;сохраняем используемые регистры 		push	bx 		push	cx ;сбрасываем счетчик 		xor	cx,cx ;устанавливаем систему счисления 		mov	bx,10 ;цикл получения остатка от деления на СС  @01:		xor	dx,dx 		div	bx ;сохраняем остаток от деления 		push	dx ;увеличиваем счетчик 		inc	cx ;пока не достгнем нуля 		or	ax,ax 		jnz	@@01 ;цикл вывода на экран чмсла ;извлекаем из стека остаток от деления  @02:		pop	ax ;преобразовываем в символ 		or	al,30h ;выводим на экран символ 		int	29h ;пока счетчик СХ больше нуля 		loop	@@02 ;востанавливаем использованные регистры и возврат 		pop	cx 		pop	bx 		ret out_Num		endp ;подпрограмма ввода массива с клавиатуры inp_asm		proc ;организовываем стековый кадр 		push	bp 		mov	bp,sp ;выводим сообщение на экран 		lea	dx,dbModule 		call	out_Msg ;извлекаем  параметры из стека 		mov	ax,[ bp+arg0 ] 		mov	bx,[ bp+arg1 ] 		mov	cx,[ bp+arg2 ] ;адресуем сегментный регистр на массив 		mov	ds,ax ;выводим сообщение на экран  @01:		lea	dx,dbEnter 		call	out_Msg ;вычисляем индекс массива 		mov	ax,[ bp+arg2 ] 		sub	ax,cx 		inc	ax ;выводим индекс массива на экран 		call	out_Num ;выводим сообщение на экран 		lea	dx,dbEqu 		call	out_Msg ;вводим число с клавиатуры 		call	inp_Num ;записываем введенное число 		mov	[ bx ],ax ;переходим к следущему элементу массива 		add	bx,2 ;пока счетчик СХ больше нуля 		loop	@@01 ;закрываем стековый кадр и возврат с освобождением стека 		mov	sp,bp 		pop	bp 		retf	argRet inp_asm		endp ;подпрограмма задания job_asm		proc ;организовываем стековый кадр 		push	bp 		mov	bp,sp ;выводим сообщение на экран 		lea	dx,dbModule 		call	out_Msg ;извлекаем входные параметры из стека 		mov	ax,[ bp+arg0 ] 		mov	bx,[ bp+arg1 ] 		mov	cx,[ bp+arg2 ] ;настраиваем сегментный регистр на массив 		mov	ds,ax ;минимальный и максимальный элемент пока первый 		mov	si,bx 		mov	di,bx ;уменьшаем счетчик проверок 		dec	cx ;в цикле переходим к следующему элементу  @01:		add	bx,2 ;проверяем с масимальным значением 		mov	ax,[ bx ] 		cmp	ax,[ di ] 		jbe	@@02 ;запоминаем новое максимальное значенине 		mov	di,bx 		jmp	short @@03 ;проверяем с минимальным значением  @02:		cmp	ax,[ si ] 		jae	@@03 ;запоминаем новое минимальное значение 		mov	si,bx ;пока счетчик СХ больше нуля  @03:		loop	@@01 ;суммируем минимальное и максимальное значение 		mov	ax,[ si ] 		add	ax,[ di ] ;делим на два 		shr	ax,1 ;из стека получаем адрес массива и счетчик 		mov	bx,[ bp+arg1 ] 		mov	cx,[ bp+arg2 ] ;провряем на совпадение с элементами массива  @04:		cmp	ax,[ bx ] 		jz	@@05 ;переходим к следующему элементу массива 		add	bx,2 ;пока счетчик СХ больше нуля 		loop	@@04  @05:		lea	dx,dbNo ;проверяемм совпадение 		cmp	ax,[ bx ] 		jnz	@@06 ;выводим сообщение о наличии элемента 		push	ax 		lea	dx,dbYes 		call	out_Msg ;вычисляем индекс элемента массива 		mov	ax,[ bp+arg2 ] 		sub	ax,cx 		inc	ax ;выводим число на экран 		call	out_Num ;выводим сообщение на экран 		lea	dx,dbEqu 		call	out_Msg ;востанавливаем значение элемента 		pop	ax ;выводим число на экран 		call	out_Num 		jmp	short @@07 ;выводим сообщенине об отсутствии числа  @06:		call	out_MSg ;востанавливаем стековый кадр и возвращаемся с освбождение стека  @07:		mov	sp,bp 		pop	bp 		retf	argRet job_asm		endp end


В каждом модуле две подпрограммы ввода данных inp_ и обработки job_.
Без модуля на паскале можно обойтись, если код подпрограмм inp_pas и job_pas перенести в тело основной программы.

Код основной программы:
Код :
program q184463; uses Crt,u184463; const n=sMass;{определяем размер массива} var L:tMass;{определяем массив} {загружаем модуль на ассемблере} {$L a184463.obj} {определяем подпрограммы } procedure inp_asm(a:tMass;b:integer);external; procedure job_asm(a:tMass;b:integer);external; procedure asmmain;assembler;   asm {вызов ассемблерного модуля из ассемблера} {в стек помещаем сегмент массива}     mov  ax,seg L     push ax {в стек помещаем смещение массива}     lea  ax,L     push ax {в стек помещаем размер массива}     mov  ax,n     push ax {вызываем подпрограмму}     call inp_asm {вызов паскалевсго модуля из ассемблера} {в стек помещаем сегмент массива}     mov  ax,seg L     push ax {в стек помещаем смещение массива}     lea  ax,L     push ax {в стек помещаем размер массива}     mov  ax,n     push ax {вызываем подпрограмму}     call job_pas     retf   end; begin {вызов подпрограмм из паскаля}   writeln('Pascal');   writeln;   inp_pas(L,n);   job_asm(L,n); {вызов подпрограмм из ассемблера}   writeln;   writeln('Assembler');   writeln;   asmmain; {ждем любую клавишу}   writeln('press any key...');   ReadKey end.


В основной программе подпрограммы inp_pas(П-П) и job_asm(П-А) вызываются из среды паскаль, а также иммируется вызов подпрограмм inp_asm(A-A) и job_pas(А-П) из среды ассемблер с помощью подпрограммы asmmain.
Код написан ТР 7.0 и TASM 2.0.
Удачи!

Консультировал: Зенченко Константин Николаевич (Модератор)
Дата отправки: 18.11.2011, 20:43
Рейтинг ответа:

НЕ одобряю 0 одобряю!


Оценить выпуск | Задать вопрос экспертам

главная страница  |  стать участником  |  получить консультацию
техническая поддержка  |  восстановить логин/пароль

Дорогой читатель!
Команда портала RFPRO.RU благодарит Вас за то, что Вы пользуетесь нашими услугами. Вы только что прочли очередной выпуск рассылки. Мы старались. Пожалуйста, оцените его. Если совет помог Вам, если Вам понравился ответ, Вы можете поблагодарить автора - для этого в каждом ответе есть специальные ссылки. Вы можете оставить отзыв о работе портале. Нам очень важно знать Ваше мнение. Вы можете поближе познакомиться с жизнью портала, посетив наш форум, почитав журнал, который издают наши эксперты. Если у Вас есть желание помочь людям, поделиться своими знаниями, Вы можете зарегистрироваться экспертом. Заходите - у нас интересно!
МЫ РАБОТАЕМ ДЛЯ ВАС!


 
 
Комментировать выпуск
     В избранное

Прошлые выпуски
RFpro.ru: Ассемблер? Это просто! Учимся программировать    18 ноября 2011, 12:36
RFpro.ru: Ассемблер? Это просто! Учимся программировать    17 ноября 2011, 12:03
RFpro.ru: Ассемблер? Это просто! Учимся программировать    14 ноября 2011, 20:33

Все выпуски рассылки

21 ноября 2011 отмечают:
День бухгалтера в&nbsp;России
День работника налоговых органов&nbsp;РФ
Всемирный день телевидения
Всемирный день приветствий
Утпанна Экадаши
Собор Архистратига Михаила и&nbsp;прочих Небесных Сил бесплотных
Мадонна делла Салюте в&nbsp;Италии

Именины: Гавриил, Марфа, Михаил, Рафаил
 
 

Subscribe рекомендует
 
Компьютеры и интернет  →   рассылки   и   группы
  
Новинки Компьютерных Игр
Обзоры последних игровых новинок. Лень покупать и листать игровые журналы? Не интересно толкаться в магазинах с играми? Не хочется ломать глаза, читая описание игры на обложке компакт-диска? Подпишитесь на рассылку!
Подписчиков: 27310
  1000 идей для блога
Для людей, которые хотят открыть свой блог и не знают с чего начать!
Подписчиков: 129
  Заработок в сети Интернет
Описание заработка в сети Интернет, от специалиста, который более 10 лет занимается этим вопросом. Гарантированные способы заработка, проверенные на личном опыте.
Подписчиков: 21691
 
 
 
Подписан адрес: admin10383.deep@blogger.com
Код этой рассылки: comp.prog.assembler
Архив рассылки
Отписаться:  На сайте  Почтой
Поддержка подписчиков
Убрать рекламу
Другие рассылки этой тематики
Другие рассылки этого автора
 
Рассылка производится: Subscribe.Ru / ЗАО «Интернет-Проекты» / О компании / Политика конфиденциальности

Комментариев нет:

Отправить комментарий