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

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



В избранное