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