Форум программистов, компьютерный форум, киберфорум
Наши страницы
Assembler, MASM, TASM
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
SlowD
1 / 1 / 0
Регистрация: 13.10.2010
Сообщений: 23
1

Программа с использованием команд обработки строк

13.10.2010, 14:01. Просмотров 1245. Ответов 6
Метки нет (Все метки)

вобщем нужно напсать програмку, но я зашел в тупик

задание: Задано 8 слов по 6 символов. В начале каждого слова записан номер из двух символов. Необходимо расставить слова в порядке возрастания номеров

долго думал как осуществить, но нечего не получилось, помогите набрасать програмку
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.10.2010, 14:01
Ответы с готовыми решениями:

Программа с использованием команд обработки строк
Снова нужна ваша помощь с лабораторной:) Есть массив из символов (mas1 db...

Линейное программирование с использованием команд сдвига???
вычислить y с использованием сдвигов y=((c*3)/2)+((c+d)/4) c,d вводиться с...

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

Разработка программ с использованием цепочечных команд
помогите, пожалуйста, в написании программы: Ввести строку из произвольного...

Разработка программ с использованием арифметических команд на языке ассемблер
По возможности напишите программу по ассемблеру в Turbo Assembler; Задание:...

6
SlowD
1 / 1 / 0
Регистрация: 13.10.2010
Сообщений: 23
19.10.2010, 19:27  [ТС] 2
вобщем както так, но ее зациклюет
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
.686
.model flat,stdcall
option casemap:none
    include ..\include\windows.inc
    include ..\include\kernel32.inc
    include ..\include\fpu.inc
    include ..\include\user32.inc
    includelib ..\lib\user32.lib
    includelib ..\lib\kernel32.lib
    includelib ..\lib\fpu.lib
    
.data
    mas1 db '32asdf 13edcv 12edfg 34tgbn 11edcf 55erty 66erty 24ujmb '
    mas2 db 56 dup(' ')
    msg db "SlowD",0
    num dd 1
.code
    start:
    cld
    .while(num>0)
    lea esi,mas1
    lea edx,mas1
    add edx,7
    lea edi,mas2
    mov ecx,7
    mov ebx,0
    mov num,ebx
    a:
    push ecx
    mov ax, word ptr [esi]
    cmp ax, word ptr [edx]
    js a1
    mov ecx,6
    movsb
    inc esi
    inc edi
    add edx,7
    inc num
    pop ecx
    dec ecx
    jnz a
    jmp a3
    a1:
    add esi,7
    add edx,7
    pop ecx
    dec ecx
    jnz a
    a3:
    lea edi,mas1
    lea esi,mas2
    mov ecx,56
    movsb
    .endw
    invoke MessageBox,
        NULL,
            addr mas1,
                addr msg,
                    MB_ICONINFORMATION
    invoke ExitProcess,0
    ret
    end start
у когото есть идеи??
0
assemb
63 / 63 / 1
Регистрация: 14.04.2010
Сообщений: 170
20.10.2010, 22:39 3
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
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
.686
.model flat,stdcall
option casemap:none
 
include \masm615\include\windows.inc
include \masm615\include\user32.inc
include \masm615\include\kernel32.inc
includelib \masm615\lib\user32.lib
includelib \masm615\lib\kernel32.lib
        
.data
    mas1 db '32asdf 13edcv 12edfg 34tgbn 11edcf 55erty 66erty 24ujmb ',0
    len equ $-mas1
    mas3 db len dup(?)    ;результат
    mas2 dw 8 dup(?)    ;сюда запишуться все цифры из mas1
    stdout DWORD ?
    cWritten DWORD ?
    _s dd 8    ;счётчик, количество перебираемых слов
    
.code
proga:
    lea esi,mas1
    lea edi,mas2
    lea edx,mas3
    lea ebp,mas3
    mov ecx,8
@@:    ;заполняется цифрами mas2
    lodsw
    sub ah,30h
    sub al,30h
    stosw
    add esi,5
    loop @b
    
    mov ecx,0    ;будет увеличиватся с каждым найденным мин-м числом(гл-й цикл)
glcikl:
    push ecx
    xor ebx,ebx
    lea esi,mas2
    mov bx,[esi]    ;bx - возможное текущее миним-е число
cikl:
    mov ecx,_s
nx:    ;загрузка и сравнение наименьшего
    lodsw
    cmp al,bl
    jbe nx1
    loop nx
    jmp obrab
nx1:
    xchg ah,al
    cmp ah,bh
    jbe _min
    loop nx
    jmp obrab
_min:    ;если нашли наим.
    xchg ah,al
    mov bx,ax
    loop nx
 
obrab:    ;поиск пробела чтобы найти текущее число
    lea edi,mas1
    mov ecx,len
    push bx
    add bh,30h
    add bl,30h
    mov al," "
_l:    ;ищем пробел и сравниваем с min(bx)
    cmp word ptr [edi],bx
    je _l1
    repne scasb
    cmp word ptr [edi],bx    ;проверяется за пробелом число 
    je _l1
    jmp _l
_l1:    ;запись в результат
    mov ecx,7
    mov esi,ebp
    add ebp,7    ;для сл-го зписываемого слова в результат - смещение
    xchg esi,edi
    rep movsb    ;запись в результат оч-го слова
    lea edi,mas2
    mov ecx,_s
    pop bx
    mov ax,bx
    repne scasw    ;поиск в mas2 текущего слова для вырезания его
    mov esi,edi
    sub edi,2
    rep movsw    ;вырезание
    dec _s
    pop ecx
    inc ecx
    cmp ecx,8
    je ex
    jmp glcikl
    
 
    ex:
    invoke GetStdHandle ,STD_OUTPUT_HANDLE
    mov stdout,eax
 
    invoke WriteConsoleA,stdout,ADDR mas3,\
       len,ADDR cWritten,NULL
 
    invoke ExitProcess, 0
end proga
1)Хотел уточнить уважаемые. Почему, если убрать 91,92,93-и строки и поставить loop вместо jmp, то выдаёт ошибку, jump destination too far. Подозреваю, что большое расстояние для loop.
2)И ещё хотел уточнить, почему, если убрать строки 50 и 56, тоесть там где xchg, то почему-то неправильно сравнивает!
Тоесть к примеру вначале в bx находится 0203(32) если смотреть в отладчике, и потом lodsw загружает в ax тоже самое число 0203. Так вот если сравнивать cmp ax,bx , то неправильно сравнивает!!? почему-то! Тоесть jbe nx1 должен отправлять на nx1 допустим, а переходит почему-то на след-ю за ней инструкцию!
1
SlowD
1 / 1 / 0
Регистрация: 13.10.2010
Сообщений: 23
21.10.2010, 07:53  [ТС] 4
у loop ограничение в дальности перехода
1
assemb
63 / 63 / 1
Регистрация: 14.04.2010
Сообщений: 170
21.10.2010, 13:01 5
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
.686
.model flat,stdcall
option casemap:none
 
include \masm615\include\windows.inc
include \masm615\include\user32.inc
include \masm615\include\kernel32.inc
includelib \masm615\lib\user32.lib
includelib \masm615\lib\kernel32.lib
        
.data
    mas1 db '32asdf 13edcv 12edfg 34tgbn 11edcf 55erty 66erty 24ujmb ',0
    len equ $-mas1
    mas2 dw 8 dup(?)    ;сюда запишутся все цифры из mas1
    
.code
proga:
    lea esi,mas1
    lea edi,mas2
    mov ecx,8
@@:    ;заполнение цифрами mas2
    lodsw
    sub ah,30h
    sub al,30h
    stosw
    add esi,5
    loop @b
;--------------------------------
    lea esi,mas2
    mov bx,[esi]    ;загружается из mas2 0203 (32 в mas1)
    
cikl:
    mov ecx,8
nx:    ;загрузка и сравнение наименьшего
    lodsw    ; в ax также загружается 0203. В первом цикле правильно сравнивает
    cmp ax,bx
    jbe _min    ;тоесть переходит на _min, по условию jbe, потому что они равны!
    loop nx    ;вот тут-то уже при переходе во 2-й цикл на nx неправильно сравнивает почему-то!
    jmp ex
_min:    ;если нашли наим.
    mov bx,ax
    loop nx
    
ex:
    invoke ExitProcess, 0
end proga
Тоесть во втором цикле nx, когда загружается очередное число из mas2 0301 (13 из mas1) при сравнении jbe должен перекинуть на _min, ведь 13 меньше чем 32! А почему-то не переходит на _min, а начинается новый цикл nx! Подскажите плиз, из-за чего это?
И снова же, при 3-ем цикле nx, когда загружается число 12, то правильно сравнивает! Тоесть во 2-м цикле неправильно сравнивает 32 и 13 (не переходит на _min), а в 3-м цикле правильно сравнивает 32 и 12(переходит на _min) ! Почему так происходит? Ведь оба числа меньше 32!

Поправочка маленькая
В 83-й строке можно pop ax сразу! И без 84-й
1
Goodwin98
2523 / 819 / 10
Регистрация: 31.05.2009
Сообщений: 1,672
21.10.2010, 17:16 6
Сколько раз я вам уже говорил еще в асе, хорошо повторю еще раз. Числа загружаются в регистры в обратном порядке. В конце концов это же видно в отладчике.
0
Миниатюры
Программа с использованием команд обработки строк  
assemb
63 / 63 / 1
Регистрация: 14.04.2010
Сообщений: 170
21.10.2010, 19:01 7
так и в bx и в ax загружается в обратном порядке! Ведь в bx число - 0203 (32), а в ax ведь не 0103, а 0301 загружается, тоесть в том же обратном порядке! Я ведь не спорю! А хочу понять что там происходит!
Или надо xchg ah,al делать?
Кстати если между 35-й и 36-й строками после lodsw поставить xchg ah,al и конечно после метки _min чтобы вернуть прежнее состояние xchg ah,al для bx, то в первом цикле не переходит на метку _min! Они ведь одинаковые (числа) в первом цикле!
0
21.10.2010, 19:01
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.10.2010, 19:01

команды обработки строк данных и организации циклов.
Дана последовательность из девяти символов(байтов),размещенных в сегменте...

создать програму которая содержит в себе команды обработки строк языка асемблер
Создать програму которая содержит в себе команды обработки строк языка...

Программа с использованием сопроцессора
необходимо написать программу для реализации вычислительных операций (+,-,/,*)...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru