Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.10.2019, 10:46   #1
alexandersinitsyn0
Новичок
Джуниор
 
Регистрация: 24.10.2019
Сообщений: 1
По умолчанию Turbo pascal + turbo assembler, не хватает единички в переменной

Связываю TURBO PASCAL + TURBO ASSEMBLER,
Код на PASCAL
Код:
program lab3;
    {$F+}
    {$L  proc.obj}
    function Copy(S: string; Start: byte; Len: byte): string;
    external;
        var S, str2:string;
        Start:byte;
        Len: byte;
        begin
        S:='1234567890$';
        Start:=3;
        Len:=6;
        str2:=Copy(S,Start, Len);
        writeln(str2);
end.
Код на assembler
Код:
code    segment byte public
        assume  cs:code
        public  Copy
Copy  proc far  
        Len     equ  byte ptr [bp+6]   ;  
        Stat    equ  byte ptr [bp+8]   ;  
        S       equ  dword ptr [bp+10] ;  
        Res     equ  dword ptr [bp+14] ;
        push bp;
        mov bp,sp;
        mov     ah,Len;
        mov     al,Stat;
        push ds;
        cld     			;сброс флага DF — обработка строки от начала к концу
        lds    si,S        ;загрузка в si смещения строки-источника
        mov 	ax,0;
        mov 	cx,0;
S_Length:                   ;Получение длины строки в CX
        lodsb
        inc 	cx;
        cmp 	ax,'$';
        jne 	S_Length; 
        dec     cx;         ;CX - длина строки на подачу
Register_settings:          ;Настройка регистров
             ;
        lds     si,S        ;загрузка в si смещения строки-источника
        les     di,Res 		;загрузка в DS смещения строки-приёмника
Erorrs:                     ;Проверка некорректных входных данных
        cmp 	stat,cl		;Если Start > S_Length
        jg 		exit		;То выходим с пустой строкой
Obrabotka:
        mov     cx,0;
        dec     Stat;       ;Уменьшаем Stat на 1 т.к. Repne учитывает и 0
        mov     cl,Stat     ;
        REPNE   lodsb       ;SI на элемент начала переноса
        mov     cl,Len      ;Сколько символов перенести
        REPNE   movsb       ;Перенос Len байт из S в RES
Exit:   
        mov     al,'$'      ;
        stosb   ;
        mov     al,0      ;
        stosb   ;
        pop     ds;
        pop     bp  
        ret 8
Copy   endp
code   ends
       end
В итоге в переменной LEN в паскале у меня не хватает еденички при обработке строки в ассемблере
Т.е. когда я передаю через паскаль число 5, ассемблер почему то копирует только 4 символа.При вызове этой процедуры из языка ассемблера все параметры передаются верно и проблем не возникает
Ну и еще , как обозначается конец стркои в паскале?Каким то кодом или последовательностью символов?

Последний раз редактировалось alexandersinitsyn0; 24.10.2019 в 11:13.
alexandersinitsyn0 вне форума Ответить с цитированием
Старый 24.10.2019, 11:04   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от alexandersinitsyn0 Посмотреть сообщение
Связываю TURBO PASCAL + TURBO ASSEMBLER,передаю параметр LEN
да нет, Вы в параметрах передаёте строку и два параметра Start и Len


Цитата:
Сообщение от alexandersinitsyn0 Посмотреть сообщение
Ну и еще , как обозначается конец стркои в паскале?Каким то кодом или последовательностью символов?
вообще, строчки в Паскале статические (память выделяется на этапе компиляции), а фактическая длина строки определяется нулевым байтом.

например.
Код:
var s : string; {создали переменную длиной 256 байт:
                           нулевой байт - длина и 255 байт - для содержимого}
begin
  s:='1234567890';
  WriteLn(s);
  s[0] := chr(3);
  WriteLn(s);
  s[0] := chr(10);
  WriteLn(s);
  ReadLn
end.
что же касается сути вопроса. Тут надо запускать отладчик и смотреть, что происходит на уровне ассемблера.
я не готов сейчас лезть так глубоко
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
TASM (Turbo assembler) - Посмотреть код, указать на ошибки dimwow Помощь студентам 2 02.06.2019 03:19
Turbo Assembler - аналог цикла FOR neponimaushimen Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 17 01.06.2019 18:41
Turbo Assembler/Перевод десятичного числа в двоичное Equality Помощь студентам 0 04.03.2014 00:24
turbo assembler/exe->com narco3 Помощь студентам 2 17.02.2013 12:04
Программа в Turbo Assembler 4atik Помощь студентам 2 28.12.2012 09:28