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

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

29.01.2012, 13:16. Просмотров 442. Ответов 1
Метки нет (Все метки)

Как делать вставку кода ассемблера в 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:16
Ответы с готовыми решениями:

SQRT32: модифицировать программу, чтобы она могла считать числа типа DQ. TASM
Привет всем. Собственно есть программа которая считает SQRT32, вводим число...

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

Подкорректировать программу, чтобы она выводила квадрат 100х100 вместо 10х10
Данная программа выводит квадрат 10х10 нужно чтоб выводила 100х100 CSeg...

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

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

1
murderer
3319 / 1465 / 134
Регистрация: 06.10.2010
Сообщений: 3,217
01.02.2012, 09:19 2
1) Чтобы не объявлять метки в label, можно поставить перед именем метки символ "@"
2) Ключевое слово ptr можно удалить
3) Процедуры оформляются так
Pascal
1
2
3
4
5
6
7
procedure WrStr;assembler;
asm
push ax
mov   ah,09h                    
int   21h
pop ax                       
end;
4) Входной аргумент для lea нужно заключать в квадратные скобки
5) Это не нужно
Assembler
1
2
3
mov ax, dseg
   mov ds, ax
   mov es, ax
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.02.2012, 09:19

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

Как перекомпилировать программу, чтобы она открывалась без участия Delphi?
Закончил писать программу. Как ее теперь перекомпилировать, чтобы она...

Доделать программу, чтобы она показывала наибольшее число из всех выбранных
Мне нужно доделать программу чтоб она показывала наибольшее число из всех...


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

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

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