0 / 0 / 0
Регистрация: 13.04.2018
Сообщений: 35
1

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

17.05.2018, 17:34. Показов 715. Ответов 8
Метки нет (Все метки)

Без понятия, как написать проверочную прогу на ассемблере для процедуры Insert (вставка подстроки в строку на заданную позицию) . код прилагаю:

laba3.asm
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
CODE         SEGMENT BYTE PUBLIC
 
             ASSUME  CS:CODE
 
 
             PUBLIC  SInsert
SInsert      PROC    FAR
             PUSH    BP                ; save TURBO-Pascal framepointer
             PUSH    DS                ; save TURBO-Pascal data segment
             MOV     BP, SP            ; make new framepointer
             LDS     SI, [BP+16]       ; address of object string
             XOR     CX, CX            ; clear msb of length of object string
             OR      CL, [SI]          ; get length of object string
             JZ      $end_ins          ; exit, if length of object string zero
             MOV     DX, [BP+8]        ; DX=pos
             MOV     AX, [BP+10]       ; AX=maximum length of target string
             LES     DI, [BP+12]       ; address of target string
             MOV     BL, ES:[DI]       ; get current length of target string
             MOV     BH, CH            ; clear msb of length of target string
                         cmp     bx, dx
             jb $end_ins
             DEC     DX                ; pos - 1
             CMP     DH, 80h           ; is pos-1 < 0 ?
             SBB     BP, BP            ; BP = FFFF if pos-1 > 0, else BP = 0
             AND     DX, BP            ; if pos-1 < 0 then set pos-1 = 0 (pos=1)
             SUB     DX, BX            ; pos-1 - targetlength
             SBB     BP, BP            ; BP = FFFF, if result negative, else 0
             AND     DX, BP            ; pos-1 - targetlength (0, if res. pos)
             ADD     DX, BX            ; pos-1, if result neg., else target len.
             MOV     BP, AX            ; maximum length of target string
             SUB     BP, DX            ; (maximum length - pos + 1) <= 0 ?
             JBE     $end_ins          ; yes, don't insert
             SUB     BP, CX            ; maximum length - pos + 1 - objectlength
             CLD                       ; select auto-increment
             JA      $make_gap         ; jump, if result positiv
             STOSB                     ; new targetlength will be maximum length
             ADD     CX, BP            ; adjust length of object string
             ADD     DI, DX            ; object string inserted after this char
             JMP     $fill             ; insert object
$make_gap:   MOV     DX, CX            ; save length of object string
             ADD     CX, BX            ; new targetlength = objectlen+targetlen
             SUB     CX, AX            ; new targetlength - maximum length
             SBB     BX, BX            ; BX=FFFF, if result negative, else BX=0
             AND     CX, BX            ; new targetlength - maximum length
             ADD     AX, CX            ; new targetlength = Min(TargLen, MaxLen)
             STOSB                     ; store it
             DEC     DI                ; correct pointer
             ADD     CX, BP            ; new targetlength - objectlength - pos+1
             ADD     DI, AX            ; this will be the last char in target
             XCHG    AX, SI            ; save offset of adress of object string
             MOV     SI, DI            ; now calculate
             SUB     SI, DX            ;  the starting position
             PUSH    DS                ; save segment of address of objectstring
             MOV     BX, ES            ; let both segment register point
             MOV     DS, BX            ; to the segment containing targetstring
             STD                       ; auto-decrement
             REP     MOVSB             ; create gap
             MOV     DI, SI            ; object will be inserted after this char
             MOV     CX, DX            ; get length of object string
             MOV     SI, AX            ; get offset of address of object string
             POP     DS                ; get segment of address of object string
             INC     DI                ; object string will be inserted here
             CLD                       ; auto-increment
$fill:       INC     SI                ; first char of object string
             SHR     CX, 1             ; number of chars to move odd ?
             JNC     $even_ins         ; no
             MOVSB                     ; yes, move a single byte
$even_ins:   REP     MOVSW             ; move the rest
$end_ins:    POP     DS                ; restore TURBO-Pascal data segment
             POP     BP                ; restore TURBO-Pascal frame pointer
             RET     12                ; return and pop parameters
SInsert      ENDP
 
             ALIGN   4
 
CODE         ENDS
 
             END
laba3.pas
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
{$F+}
{$L laba3.obj}
procedure SInsert(SubS:string;var S:string;Start:byte);
external;
 
var
S,SubS:string;
P:byte;
begin
write('vvod stroki: ');
readln(S);
write('vstavlyaemaya stroka: ');
readln(SubS);
write('posiciya: ');
readln(P);
SInsert(SubS,S,P);
Writeln(S);
end.
Помогите, пожалуйста, завтра сдавать надо, а я сам никак не сделаю
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.05.2018, 17:34
Ответы с готовыми решениями:

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

Есть код на ассемблере(метод прогонки сплайнами), но не знаю, работает ли. Порекомендуйте программу для компиляции
Реализуется метод прогонки кубическими сплайнами. Код я написала в C++ и дизассемблировала. Но...

Написать код (на ассемблере ,в среде Delphi) для F=z2+sinz2
Ошибка в теме:F=z2+sinZ1 функцией sin пользоваться нельзя. Для sin использовать разложение в ряд...

Нужно сделать задачу, а не знаю как!
Во общем долго мучаюсь. Помогите пожалуйста, не получается сделать. Заранее спасибо!

8
Заблокирован
17.05.2018, 18:20 2
Цитата Сообщение от RedStormgg Посмотреть сообщение
Без понятия, как написать проверочную прогу на ассемблере для процедуры Insert
Проверочным кодом будет код, который после Insert сравнивает полученную строку с ожидаемой. Если они совпадают, то этот тест проверку прошел. И так сделать несколько тестов.
0
0 / 0 / 0
Регистрация: 13.04.2018
Сообщений: 35
17.05.2018, 18:22  [ТС] 3
Цитата Сообщение от Pavel_Srgv Посмотреть сообщение
Проверочным кодом будет код, который после Insert сравнивает полученную строку с ожидаемой. Если они совпадают, то этот тест проверку прошел. И так сделать несколько тестов.
Увы, я не знаю, как это сделать. В этом-то вся и проблема
0
Модератор
Эксперт по электронике
8195 / 4121 / 1570
Регистрация: 01.02.2015
Сообщений: 12,755
Записей в блоге: 3
17.05.2018, 19:58 4
что-то такое
Pascal
1
2
3
4
5
6
7
8
9
10
11
var
  s1, s2: string;
.......
  s1:=s;
  s2:=s;
  SInsert(SubS,s1,P);
  Insert(SubS,s2,P);
  if s1=s2 then
    writeln('Ok')
  else
    writeln('ploho');
0
0 / 0 / 0
Регистрация: 13.04.2018
Сообщений: 35
17.05.2018, 20:12  [ТС] 5
Цитата Сообщение от ФедосеевПавел Посмотреть сообщение
что-то такое
Pascal
1
2
3
4
5
6
7
8
9
10
11
var
  s1, s2: string;
.......
  s1:=s;
  s2:=s;
  SInsert(SubS,s1,P);
  Insert(SubS,s2,P);
  if s1=s2 then
    writeln('Ok')
  else
    writeln('ploho');
это как отдельный файл?
upd. паскаль-то еще понятно, а асм - ни капли

Добавлено через 5 минут
Цитата Сообщение от ФедосеевПавел Посмотреть сообщение
что-то такое
Pascal
1
2
3
4
5
6
7
8
9
10
11
var
  s1, s2: string;
.......
  s1:=s;
  s2:=s;
  SInsert(SubS,s1,P);
  Insert(SubS,s2,P);
  if s1=s2 then
    writeln('Ok')
  else
    writeln('ploho');
мне-то нужно не на паскале проверочный файл написать, а на ассемблере
0
Модератор
Эксперт по электронике
8195 / 4121 / 1570
Регистрация: 01.02.2015
Сообщений: 12,755
Записей в блоге: 3
17.05.2018, 20:27 6
Попробуйте.
Я за сегодня очень устал. Какие-нибудь ошибки исправлю до 21:30 по мск. Но на целую программу сил не хватит.
0
Заблокирован
18.05.2018, 00:17 7
Цитата Сообщение от RedStormgg Посмотреть сообщение
я не знаю, как написать код проверки на Ассемблере
Для сравнения строк можно использовать инструкции cmps.
0
Модератор
Эксперт по электронике
8195 / 4121 / 1570
Регистрация: 01.02.2015
Сообщений: 12,755
Записей в блоге: 3
19.05.2018, 10:08 8
RedStormgg, первое впечатление, что SInsert принимает не три, а четыре параметра. Да ещё и в другом порядке, нежели можно предположить из Pascal исходника.
0
0 / 0 / 0
Регистрация: 13.04.2018
Сообщений: 35
19.05.2018, 10:09  [ТС] 9
Цитата Сообщение от ФедосеевПавел Посмотреть сообщение
RedStormgg, первое впечатление, что SInsert принимает не три, а четыре параметра. Да ещё и в другом порядке, нежели можно предположить из Pascal исходника.
Спасибо за ответы по этой теме, но я уже сделал и сдал
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.05.2018, 10:09
Помогаю со студенческими работами здесь

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

Не знаю как написать код iframe!
Помогите! Хочу создать своюстраничку с юзербарами и юзербоксами. Всё готово, только не могу...

Нужно написать решение не знаю как к субботе
Необходимо проверить делиться веденное число на 3. Число деться на 3 если сумма его цифр делиться...

Нужно сделать задачу, а то я уже не знаю как
Направляясь к концу уровня 1-1 в игре Nintendo's Super Mario Brothers, Марио должно сойти на...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru