Logo Море(!) аналитической информации!
IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware
Архив форумов ЦИТФорума
Море(!) вопросов - Море(!) ответов
 
 FAQFAQ   ПоискПоиск   ПользователиПользователи   ГруппыГруппы   РегистрацияРегистрация 
 ПрофильПрофиль   Войти и проверить личные сообщенияВойти и проверить личные сообщения   ВходВход 
Как правильно задавать вопросы

Странно, но вопрос по asm

 
Перейти:  
Этот форум закрыт, вы не можете писать новые сообщения и редактировать старые.   Эта тема закрыта, вы не можете писать ответы и редактировать сообщения.    Список форумов Архив форумов ЦИТФорума -> Программирование
Предыдущая тема :: Следующая тема  
Автор Сообщение
sniper::p



Зарегистрирован: 04.10.2005
Сообщения: 237
Откуда: rus/73

СообщениеДобавлено: Чт Янв 25 2007 00:06    Заголовок сообщения: Странно, но вопрос по asm Ответить с цитатой

В общем, товарищи, возникла необходимость реализовать паскалевскую функцию Copy на асме. Паскаль берется 70 - 71, поэтому инструкции 8086 и 286. Еще просьба - реализовать наглядно (т.е. без всяких там умных оптимизаций для ускорения работы на наносекунды и т.п. Smile ). Срочно
ЗЫ Кто не помнит, я напомню на всякий случай ее (ф-ии) определение:
Код:
function Copy(s: string; ind: integer; count: integer): string; assembler;
Т.е. желательно в таком виде
_________________
Нет предела совершенствованию
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
Jail



Зарегистрирован: 16.01.2007
Сообщения: 180
Откуда: Russia

СообщениеДобавлено: Чт Янв 25 2007 13:30    Заголовок сообщения: Ответить с цитатой

Ассемблер более менее знаю, но вот с Паскалем проблемка. Поясни хоть поконкретнее чего она(ф-ия) делает то, поподробнее??? Может чема и поможем. Smile
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
grf



Зарегистрирован: 05.04.2005
Сообщения: 1242
Откуда: Москва

СообщениеДобавлено: Чт Янв 25 2007 15:02    Заголовок сообщения: Ответить с цитатой

Выделение из строки s подстроки длиной count символов, выделение подстроки начинается с символа в позиции ind
_________________
Errare humanum est
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
sniper::p



Зарегистрирован: 04.10.2005
Сообщения: 237
Откуда: rus/73

СообщениеДобавлено: Чт Янв 25 2007 22:33    Заголовок сообщения: Ответить с цитатой

grf писал(а):
Выделение из строки s подстроки длиной count символов, выделение подстроки начинается с символа в позиции ind
Гениально! И как я сразу не догадался?!..
Код:
;-------------------------------------------------------------------------------
; Copy standard function: Copy (VAR S: STRING; Index, Count: INTEGER): STRING
;
; Copy copies Count characters from S, starting at position Index to a 256 byte
; temporary string buffer. If there are less than Count characters in S after
; Index, the routine copies all the characters from Index to the end of S (note
; that this number can be zero).
;
; On entry:  [SP+4]  Count
;            [SP+6]  Index
;            [SP+8]  Address of source string S
;            [SP+12] Address of destination string
;
; On exit:   [SP]    Address of destination string
;-------------------------------------------------------------------------------

SCopy        PROC    FAR
             CLD                       ; auto increment for string instructions
             PUSH    DS                ; save caller's data segment
             MOV     BX, SP            ; make new frame pointer
             LES     DI, SS:[BX+14]    ; load pointer to destination
             LDS     SI, SS:[BX+10]    ; load pointer to source
             MOV     AX, SS:[BX+6]     ; get copy count
             MOV     BX, SS:[BX+8]     ; get index
             CWD                       ; DX = FFFF if count negative, else DX=0
             NOT     DX                ; DX = FFFF if count positive, else DX=0
             AND     AX, DX            ; Max (count, 0)
             DEC     BX                ; index - 1
             CMP     BH, 80h           ; index-1 < 0 ?
             SBB     DX, DX            ; DX = FFFF if index-1 pos., else DX = 0
             AND     BX, DX            ; Max (index-1, 0)
             MOV     CL, [SI]          ; source length
             INC     SI                ; pointer to 1st char of source
             XOR     CH, CH            ; zero-extend source length to word
             SUB     BX, CX            ; index - 1 - length
             SBB     DX, DX            ; DX=0, if index-1 > length, else DX=FFFF
             AND     BX, DX            ; - max # of chars that could be copied
             NEG     BX                ; maxcount
             SUB     AX, BX            ; count - maxcount
             SBB     DX, DX            ; DX=0, if count > maxcount, else DX=FFFF
             AND     AX, DX            ; count - maxcount = 0, if count>maxcount
             ADD     AX, BX            ; AX = Min (Count, MaxCount)
             SUB     CX, BX            ; CX = Min (Index-1, Length)
             ADD     SI, CX            ; pointer to first char to copy
             STOSB                     ; store length of result
             MOV     CX, AX            ; need it in CX for string instruction
             SHR     CX, 1             ; number of chars odd ?
             JNC     $even_copy        ; no, even
             MOVSB                     ; move single char
$even_copy:  REP     MOVSW             ; copy chars two at a time
             POP     DS                ; restore caller's data segment
             RET     8                 ; leave destination pointer on stack
SCopy        ENDP
Найдено в загашниках
_________________
Нет предела совершенствованию
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
Показать сообщения:   
Этот форум закрыт, вы не можете писать новые сообщения и редактировать старые.   Эта тема закрыта, вы не можете писать ответы и редактировать сообщения.    Список форумов Архив форумов ЦИТФорума -> Программирование Часовой пояс: GMT + 3
Страница 1 из 1

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах


Powered by phpBB © 2001, 2002 phpBB Group
Русская поддержка phpBB

 

IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware

Информация для рекламодателей PR-акции, размещение рекламы — adv@citforum.ru,
тел. +7 495 6608306, ICQ 232284597
Пресс-релизы — pr@citforum.ru
Послать комментарий
Информация для авторов
This Web server launched on February 24, 1997
Copyright © 1997-2000 CIT, © 2001-2006 CIT Forum
Внимание! Любой из материалов, опубликованных на этом сервере, не может быть воспроизведен в какой бы то ни было форме и какими бы то ни было средствами без письменного разрешения владельцев авторских прав. Подробнее...