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

Задачи по ассемблеру

  Все выпуски  

Задачи по ассемблеру


Информационный Канал Subscribe.Ru


Задачи по ассемблеру.


Выпуск #27.

Добрый день, уважаемые подписчики! После длительного перерыва рассылка выходит опять! Ура!

 

Сегодня в выпуске:

1. Решение задачи #26.

2. Задача #27.

3. Срочно нужно

 

Решение задачи #26.

 

Дисквалификация.

Edward Samokhvalov - программа так и не запустилась.

 

Таблица рекордов:

  Участник

Размер решения

2. G3 67 байт
4. Alex 100 байт

 

Условие задачи.

Создать EXE-файл, выводящий на экран строку, введенную в командной строке.

 

Решения.

Решение by G3:

;Task #26 by G3 (tgm80@mail.ru), 67 bytes
;tasm /m task.asm
;tlink /x /3 /t task.obj
 .model tiny
 .386
 .code

  org 100h
Start:
  xchg ax,cx   ;cx = 0
  mov ah,3Ch
  mov dx,offset FileName
  int 21h   ;создать файл

  xchg ax,bx   ;bx = описатель файла
  shr si,1   ;si = 80h - строка параметров (идею свистнул у Shur'а;)
  mov di,offset FileData
  lodsb
  xchg ax,cx   ;cx = длина строки параметров
  rep movsb   ;поместить строку параметров после секции кода
  mov ax,4024
  stosb    ;дописать '$' в конец строки
  mov ch,3eh   ;cx = длина файла (большой;)
  mov dl,low offset FileHeader
  int 21h   ;сохранить данные в файл

  xchg ax,cx   ;ah=3Eh
  int 21h   ;закрыть файл
  ret    ;выйти из COM программы

;заголовок EXE программы
;см. статью "минимальная stub-программа"
;в архиве assembler.ru (http://www.wasm.ru/docs/1/assemblerru.zip)

 FileHeader dw 5A4Dh  ;подпись exe-файла ('MZ')
   dw 0000h  ;длина последней неполной страницы образа, байт (не исп.)
   dw 001Fh  ;длина образа, страниц (страница = 512 байт)
   dw 0000h  ;число элементов в таблице перемещения
   dw 0001h  ;размер exe-заголовка, параграфов (для опред. начала кода)
 FileName db '1.exe',0 ;мин. и макс.(должно быть >0) требуемой памяти, значение ss
   dw  0113h  ;значение регистра sp при запуске
   dw 0000h  ;контрольная сумма исполняемого модуля (не исп.)
     dw 0008h  ;значение ip при запуске (смещение кода от нач. параграфа)
   dw 0000h  ;сегментное смещение кодового сегмента (cs=ds=PSP)

;далее идет секция кода, так как значения остальных полей заголовка в данном случае роли не играют

  mov dx,sp    ;значение sp (0110h) передается в заголовке
  xchg ax,bp    ;ah=09h
                int     21h    ;вывести строку

  xchg ax,bp    ;ah=0
  int 16h    ;ждать нажатия клавиатуры

  push ds
  push bx
  retf     ;выйти из EXE программы (переход на адрес PSP:0000)

FileData db ?    ;сюда будет скопирована строка для вывода

end Start

Решение by Alex:

;tasm /m2 task26.asm
;tlink /t task26
;100 bytes
;by Alex
;С форматом PE файлов знаком плохо, поэтому exeшник создал tlink, дальше методом проб и ошибок менял байты
;в Windows у меня всё работает, в чистом DOS не проверял!

CSEG segment
assume cs:CSEG, ds:CSEG, ss:CSEG, es:CSEG
org 100h
 .386

main:
mov di,offset bufer+9
xor ax,ax; если в cmd написать z:\, то al=ffh
mov cl,15
rep stosb; пишем 15 нулей
mov al,'>'
stosb;  какой-то байт
xchg ax,cx;ax=0

mov cl,37
rep stosb; ещё 38 нулей
inc ax
stosb;  одну единицу
dec ax
mov cx,449
rep stosb; потом ещё 449 нулей
mov si,offset data1
mov cl,22
rep movsb; пишем заголовок файла и прочую информацию

mov cl,ds:[80h];cx=number of symbols in cmd
mov si,82h
rep movsb; пишем командную строку
mov al,'$'
stosb;  и символ завершения для 9 ф-ции int 21h

;создаём&открываем файл
mov ah,3ch
mov dx,offset filename
;cx=0
int 21h

;Пишем в файл
xchg bx,ax;bx=handle
mov ah,40h
mov dx,offset bufer
mov cx,636
int 21h

quit:
ret
filename db '1.exe',0
;Всё, что дальше будет в exeшнике
;--------------------------------------------
data1 db 'ё',0,'ЋШґ є',0,'Н!3АНё LН!',0;сам код
bufer db 'MZ ',0,'',0,'',0,' ', 525 dup (?)
cmdline_symbols db 100 DUP (?);буфев под cmd
;--------------------------------------------
cseg ends
end main

 

Задача #27.

 

Задание:

Написать программу, которая рисует на экране линии с помощью клавиш влево, вправо, вверх, вниз.

! Программа должна работать в стандартном текстовом режиме.

! Нужно позаботиться о пересечении линий - если горизонтальная линия идет на пересечение вертикальной, то соответствующий символ на экране заменяется на "" (не знаю как у Вас отобразится этот символ, но должны быть две перпендикулярно пересекающиеся линии).

! Нужно позаботиться о символе "поворота" линий, т.е. чтобы не было разрывов между двумя линиями, составляющими поворот.

! В общем, два предыдущих пункта можно объединить в один - перед тем, как менять символ после изменения позиции курсора, нужно посмотреть что за символ здесь находился, где был курсор до изменения позиции, и, пользуясь этими данными, программа должна дополнить, а не изменить символ. Т.е., как во втором пункте, знак "|" не меняется на знак "-", а меняется на символ их пересечения, т.е. символ "|" дополняется символом "-", и т.п. знаки также меняются. (Это было условное изображение нужных нам символов, а вообще нужно использовать только символы псевдографики).

! Выход из программы по нажатию Enter.

 

 

Отправить решение до 25.07.2003

 

Срочно нужно...

Срочно нужно придумать название сайту, потому что он уже готов и я хочу, чтобы Вы его увидели. Сайт пока не является чем-то супер-супер, но по мере его существования, я думаю, он таковым станет. Единственная загвоздка сейчас - это отсутствие хорошего, звучащего названия. Все названия, что я придумывал уже зарегистрированы. Если у Вас есть идеи, то присылайте варианты названия мне на почту - igoryk@fromru.com. Спасибо.

 

В заключение...

На главной странице сайта http://www.igoryksoft.narod.ru/ будут даны размеры программ лидеров, как только таковые появятся. И так будет с каждой задачей. Узнав, эту информацию каждый может прислать более оптимизированное решение.

Любые предложения по улучшению рассылки, Ваши задачи, вопросы прошу присылать мне на почту, указанную внизу рассылки. 

 

(с) IgorykSoft Все права защищены! 
URL: http://www.igoryksoft.narod.ru/  E-Mail: Igoryk@FromRu.Com


http://subscribe.ru/
E-mail: ask@subscribe.ru
Отписаться
Убрать рекламу

В избранное