Форум программистов, компьютерный форум, киберфорум
Наши страницы
Turbo Pascal
Войти
Регистрация
Восстановить пароль
 
Kroleg
0 / 0 / 0
Регистрация: 13.02.2011
Сообщений: 31
1

Помогите доделать программу на ассемблере, чтобы она открывалась в Pascal.

29.01.2012, 13:17. Просмотров 426. Ответов 5
Метки нет (Все метки)

Как делать вставку кода ассемблера в Pascal я понимаю только теоретически:
пишем: Uses crt;
label "объявляем метки"
var "объявляем переменные"
asm
"код на ассемблере"
writeln "Выводим необходимые значения"
end.
Вот код на ассемблере (программа находит минимальное слово, которое было введено с клавиатуры и общее количество слов):


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
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
sseg segment stack 'STACK'
  db 1024 dup (?)
sseg ends  
dseg segment
   str1  db 30 dup (?)                        
   cout   db      13,"Vvedite stroku(Dolzna nachinatsa i zakanchivatsa simvolom):> ",'$'     
   text1 db 13,10,'naimenshee slovo','$' 
   text2 db 13,10,'kolichestvo slov','$'    
   len dw ?
   kol dw 0
   Strmin db 9 dup (?), '$' 
   Negate db ? 
   CRLF db 13, 10, '$' 
dseg ends
cseg segment 'CODE'  
assume cs:cseg, ds:dseg
start:  mov ax, dseg
   mov ds, ax
   mov es, ax  
start1: 
call stroka                         
call strlen
mov len, cx ;длина минимального
mov bx, 0   ;длина текущего слова
lea si, str1  
begin: 
inc ax              
cmp byte ptr [si + bx], ' '
je  nextword_min
inc bx        
cmp ax, len 
je nextword_min        
jmp begin
nextword_min:            ; нашли пробел, значит переходим к следующему слову
add kol, 01 
cmp cx, bx
jl oldlong_min           ;если больше минимального, значит оставить старую длину минимального слова
mov di, si
mov cx, bx
oldlong_min:
add si, bx
inc si
mov bx, 0                    ;проверяем, нет ли ещё пробелов
cmp byte ptr [si + bx], ' '  ;проверяем нет ли ещё пробелов
je  escho_probel
cmp ax, len 
je showword_min   
jmp begin
escho_probel:
inc si
inc ax
cmp byte ptr [si + bx], ' '
je  escho_probel
jmp begin
call vivod
fin:    mov ax, 04c00h
int 21h
;----------------------------------------------
vivod proc near
showword_min:
lea dx, text2
call wrstr    
call newline
mov ax, kol
call StrCon 
mov dx, si
call wrstr 
lea dx, text1
call wrstr    
call newline
mov ax, 00
mov ah, 6
showword_min2: 
mov dl, [di + bx]
cmp dl, ' '
je fin
int 21h
inc di
jmp showword_min2
vivod endp
WrStr proc near
push ax
mov   ah,09h                    
int   21h
pop ax                       
ret                                 
WrStr  endp 
                 
StrCon proc 
push ax
push cx
push dx 
push bx    
mov cx, 10  
lea si, StrMin + 7   
mov Negate, 0                              
                 
cmp ax, 8000h    
jb m6      
neg ax  
mov Negate, 1  
m6: 
cmp ax, 10                                 
                          
jb m7                
cwd                  
div cx                
or dl, 30h           
mov [si], dl       
dec si                 
jmp m6              
m7: 
or al, 30h          
mov [si], al       
cmp Negate, 0                              
                                 
jz m8                
dec si                  
mov byte ptr [si], '-'                     
                                             
m8 : pop bx
pop dx
pop cx
pop  ax   
ret 
StrCon endp
                
stroka proc
push ax
push cx
push bx  
mov     dx,offset cout
call wrstr        
mov     ah,3fh
lea     dx,str1
mov     cx,30
mov     bx,0    
int  21h  
pop bx
pop cx
pop  ax
ret  
stroka endp 
                 
strlen proc
mov di, offset str1
mov cx, 0FFFFh 
xor ax, ax 
repnz scasb 
not cx 
sub cx, 3
ret 
strlen endp 
                
NewLine proc 
push dx          
mov     dx, offset CRLF 
call    WrStr 
pop dx  
ret 
NewLine endp       
cseg ends
end start
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.01.2012, 13:17
Ответы с готовыми решениями:

Cоставить программу чтобы она выводила картинку:
Cоставить программу чтобы она выводила картинку: * ** *** **** Кол-во...

Составить программу чтобы она выводила картинку
Составить программу чтобы она выводила картинку: ////// \\\\\\ //////...

Исправить программу,чтобы помимо ответа она еще и решение показывала
program sol; var n : longint; function f(n : longint) : longint; ...

Программу сортировки нужно переделать так, чтобы она содержала процедуры
следующую программу сортировки нужно переделать так, чтобы она содержала...

Как написать вторую программу, чтобы она открывала первую в качестве процесса?
Помогите разобраться, я написала одну программу на нахождение площади...

5
Puporev
Модератор
55451 / 42564 / 29415
Регистрация: 18.05.2008
Сообщений: 100,687
29.01.2012, 13:30 2
А это работает в Ассемблере? А то Паскаль не хочет признавать уже первую строку
Assembler
1
sseg segment stack 'STACK'
0
Kroleg
0 / 0 / 0
Регистрация: 13.02.2011
Сообщений: 31
29.01.2012, 14:16  [ТС] 3
Цитата Сообщение от Puporev Посмотреть сообщение
А это работает в Ассемблере? А то Паскаль не хочет признавать уже первую строку
Assembler
1
sseg segment stack 'STACK'
Эта программа в рабочем состоянии. А то что паскаль не хочет признавать уже первую строку, так это скорее всего потому, что её в паскалевской программе вообще и быть не должно, как в прочем и второй и третей и т.д. аж до метки start. Но это не факт, а лишь предположение, основанное на моих не глубоких теоретических сведениях по поводу этого вопроса.
0
Puporev
Модератор
55451 / 42564 / 29415
Регистрация: 18.05.2008
Сообщений: 100,687
29.01.2012, 14:30 4
Цитата Сообщение от Kroleg Посмотреть сообщение
её в паскалевской программе вообще и быть не должно,
Это само сабой. Я имею ввиду не признает в таком виде
Pascal
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
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
uses crt;
begin
clrscr;
asm
sseg segment stack 'STACK'
  db 1024 dup (?)
sseg ends
dseg segment
   str1  db 30 dup (?)                        
   cout   db      13,"Vvedite stroku(Dolzna nachinatsa i zakanchivatsa simvolom):> ",'$'     
   text1 db 13,10,'naimenshee slovo','$' 
   text2 db 13,10,'kolichestvo slov','$'    
   len dw ?
   kol dw 0
   Strmin db 9 dup (?), '$' 
   Negate db ? 
   CRLF db 13, 10, '$' 
dseg ends
cseg segment 'CODE'  
assume cs:cseg, ds:dseg
start:  mov ax, dseg
   mov ds, ax
   mov es, ax
start1:
call stroka
call strlen
mov len, cx ;длина минимального
mov bx, 0   ;длина текущего слова
lea si, str1
begin:
inc ax
cmp byte ptr [si + bx], ' '
je  nextword_min
inc bx
cmp ax, len
je nextword_min
jmp begin
nextword_min:            ; нашли пробел, значит переходим к следующему слову
add kol, 01
cmp cx, bx
jl oldlong_min           ;если больше минимального, значит оставить старую длину минимального слова
mov di, si
mov cx, bx
oldlong_min:
add si, bx
inc si
mov bx, 0                    ;проверяем, нет ли ещё пробелов
cmp byte ptr [si + bx], ' '  ;проверяем нет ли ещё пробелов
je  escho_probel
cmp ax, len
je showword_min
jmp begin
escho_probel:
inc si
inc ax
cmp byte ptr [si + bx], ' '
je  escho_probel
jmp begin
call vivod
fin:    mov ax, 04c00h
int 21h
;----------------------------------------------
vivod proc near
showword_min:
lea dx, text2
call wrstr
call newline
mov ax, kol
call StrCon
mov dx, si
call wrstr
lea dx, text1
call wrstr
call newline
mov ax, 00
mov ah, 6
showword_min2:
mov dl, [di + bx]
cmp dl, ' '
je fin
int 21h
inc di
jmp showword_min2
vivod endp
WrStr proc near
push ax
mov   ah,09h
int   21h
pop ax
ret
WrStr  endp
 
StrCon proc
push ax
push cx
push dx
push bx
mov cx, 10
lea si, StrMin + 7
mov Negate, 0
 
cmp ax, 8000h
jb m6
neg ax
mov Negate, 1
m6:
cmp ax, 10
 
jb m7
cwd
div cx
or dl, 30h
mov [si], dl
dec si
jmp m6
m7:
or al, 30h
mov [si], al
cmp Negate, 0
 
jz m8
dec si
mov byte ptr [si], '-'
 
m8 : pop bx
pop dx
pop cx
pop  ax
ret
StrCon endp
 
stroka proc
push ax
push cx
push bx
mov     dx,offset cout
call wrstr
mov     ah,3fh
lea     dx,str1
mov     cx,30
mov     bx,0
int  21h
pop bx
pop cx
pop  ax
ret
stroka endp
 
strlen proc
mov di, offset str1
mov cx, 0FFFFh
xor ax, ax
repnz scasb
not cx
sub cx, 3
ret
strlen endp
 
NewLine proc
push dx
mov     dx, offset CRLF
call    WrStr
pop dx
ret
NewLine endp
cseg ends
end start;
readln
end.
обычно ассемблерные вставки в таком виде работают.

Добавлено через 44 секунды
Видимо нужно весь ассемблерный код переделывать..

Добавлено через 1 минуту
Может нужно просто написать программу на Паскале по этому условию?
0
Kroleg
0 / 0 / 0
Регистрация: 13.02.2011
Сообщений: 31
29.01.2012, 14:39  [ТС] 5
Цитата Сообщение от Puporev Посмотреть сообщение
Это само сабой. Я имею ввиду не признает в таком виде
Pascal
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
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
uses crt;
begin
clrscr;
asm
sseg segment stack 'STACK'
  db 1024 dup (?)
sseg ends
dseg segment
   str1  db 30 dup (?)                        
   cout   db      13,"Vvedite stroku(Dolzna nachinatsa i zakanchivatsa simvolom):> ",'$'     
   text1 db 13,10,'naimenshee slovo','$' 
   text2 db 13,10,'kolichestvo slov','$'    
   len dw ?
   kol dw 0
   Strmin db 9 dup (?), '$' 
   Negate db ? 
   CRLF db 13, 10, '$' 
dseg ends
cseg segment 'CODE'  
assume cs:cseg, ds:dseg
start:  mov ax, dseg
   mov ds, ax
   mov es, ax
start1:
call stroka
call strlen
mov len, cx ;длина минимального
mov bx, 0   ;длина текущего слова
lea si, str1
begin:
inc ax
cmp byte ptr [si + bx], ' '
je  nextword_min
inc bx
cmp ax, len
je nextword_min
jmp begin
nextword_min:            ; нашли пробел, значит переходим к следующему слову
add kol, 01
cmp cx, bx
jl oldlong_min           ;если больше минимального, значит оставить старую длину минимального слова
mov di, si
mov cx, bx
oldlong_min:
add si, bx
inc si
mov bx, 0                    ;проверяем, нет ли ещё пробелов
cmp byte ptr [si + bx], ' '  ;проверяем нет ли ещё пробелов
je  escho_probel
cmp ax, len
je showword_min
jmp begin
escho_probel:
inc si
inc ax
cmp byte ptr [si + bx], ' '
je  escho_probel
jmp begin
call vivod
fin:    mov ax, 04c00h
int 21h
;----------------------------------------------
vivod proc near
showword_min:
lea dx, text2
call wrstr
call newline
mov ax, kol
call StrCon
mov dx, si
call wrstr
lea dx, text1
call wrstr
call newline
mov ax, 00
mov ah, 6
showword_min2:
mov dl, [di + bx]
cmp dl, ' '
je fin
int 21h
inc di
jmp showword_min2
vivod endp
WrStr proc near
push ax
mov   ah,09h
int   21h
pop ax
ret
WrStr  endp
 
StrCon proc
push ax
push cx
push dx
push bx
mov cx, 10
lea si, StrMin + 7
mov Negate, 0
 
cmp ax, 8000h
jb m6
neg ax
mov Negate, 1
m6:
cmp ax, 10
 
jb m7
cwd
div cx
or dl, 30h
mov [si], dl
dec si
jmp m6
m7:
or al, 30h
mov [si], al
cmp Negate, 0
 
jz m8
dec si
mov byte ptr [si], '-'
 
m8 : pop bx
pop dx
pop cx
pop  ax
ret
StrCon endp
 
stroka proc
push ax
push cx
push bx
mov     dx,offset cout
call wrstr
mov     ah,3fh
lea     dx,str1
mov     cx,30
mov     bx,0
int  21h
pop bx
pop cx
pop  ax
ret
stroka endp
 
strlen proc
mov di, offset str1
mov cx, 0FFFFh
xor ax, ax
repnz scasb
not cx
sub cx, 3
ret
strlen endp
 
NewLine proc
push dx
mov     dx, offset CRLF
call    WrStr
pop dx
ret
NewLine endp
cseg ends
end start;
readln
end.
обычно ассемблерные вставки в таком виде работают.

Добавлено через 44 секунды
Видимо нужно весь ассемблерный код переделывать..

Добавлено через 1 минуту
Может нужно просто написать программу на Паскале по этому условию?
Та в том-то и вся соль, что нужно как раз сделать так, чтобы программа написанная на ассемблере работала или в паскале или в C++...
0
Puporev
Модератор
55451 / 42564 / 29415
Регистрация: 18.05.2008
Сообщений: 100,687
29.01.2012, 14:44 6
Тогда почитай это, а то из Ассемблера только название и знаю...
http://citforum.ru/programming/tasm3/tasm3_19.shtml
0
29.01.2012, 14:44
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.01.2012, 14:44

Что нужно добавить в программу чтобы она считала еще и количество слов?
program lab_8; uses crt; {подключаем модуль...

Помогите доработать программу в Pascal
Люди...помогите пожалуйста с паскаль..мне срочно нужно..( Нужно вот эту...

Как сделать программу в паскале, чтобы она показывала нужный текст в зависимости от ввода ключа
Помогите плиз) Как сделать программу в паскале, чтобы она показывала нужный...


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

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

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