• Paranoid - курс по анонимности и безопасности в сети от команды codeby. Защита персональных данных, анонимность в сети интернет, настройка виртуальных машин, безопасная передача данных, анти форензика и еще много всего полезного. Подробнее ...

Ассемблер

  • Автор темы Guest
  • Дата начала
Статус
Закрыто для дальнейших ответов.
G

Guest

#1
программа должна работать (пример из методички). Когда запускаю файл .obj выводится warning - No stack. Что делать?
Код:
stseg  segment para	stack
dw	 16	 dup(?)
stseg  ends
dseg	segment para
a	  dw	 10
b	  dw	 20
c	  dw	 25
y	  dw	 ?
dseg	ends
cseg	segment para
lab1	proc	far
assume cs:cseg,ds:dseg,ss:stseg
push	ds
mov	 ax,0
push	ax
mov	 ax,dseg
mov	 ds,ax
mov	 ax,a
add	 ax,b
sub	 ax,c
mov	 y,ax
ret
lab1	endp
cseg	ends
end	 lab1
 
M

Maxx

#2
добавить стек или создавать com файл

стек создается примерно так
_stack segment word stack 'stack'
dw 100h dup (?)
_stack ends

создание com файла (tasm)
tlink /t file.obj
 
I

Igorg

#3
<!--QuoteBegin-госик+15:02:2007, 18:33 -->
<span class="vbquote">(госик @ 15:02:2007, 18:33 )</span><!--QuoteEBegin-->Когда запускаю файл .obj
[snapback]56327" rel="nofollow" target="_blank[/snapback]​
[/quote]
Что это значит? Рано объекный файл запускать, надо компоновщиком преобразовать его в исполняемый.
Код:
stseg  segment para	stack
dw	 16	 dup(?)
stseg  ends
В исходном тексте стек описан, этого должно быть достаточно (правда, размер стека маловат, рекомендуют минимум 100h).
Масмом:
ml /c file.asm
link file.obj
сформируется file.exe, его запускай.
 
K

Katia+

#4
Помогите пожалуйста, задача следующая:
в обьектном файле должна быть функция написанная на ассемблере,
функция вызывается из турбо паскаля с определенными входными параетрами
на входе (в паскале) число типа Longint, на выходе (в том же паскале) строка (String)
входное число в 10-й сс должно преобразовываться в символьное (строковое) представление в 8-й сс
смутно представляю как это сделать
нет ли у кого-нибудь в библиотечке макрокоманд по такому преобразованию
как передать параметры через стек или через регистры??? Извините за ламерство :)
буду рада любым советам.
 
I

Igorg

#5
Я в Паскале не специалист, могу предложить вот что (все нижеописанное касается только 16-и разрядной архитектуры):
Имеем, скажем, такую функцию:
Код:
function f(arg: LongInt): String; far;
Вызываем ее, в стек помещается сначала старшее слово arg, затем его младшее слово (либо наоборот, это надо дебагом посмотреть). Затем в стек помещается адрес возврата (два слова для дальней подпрограммы) и осуществляется переход на первую команду подпрограммы. В ассемблере:
Код:
F proc far

arg_low	EQU word ptr [bp + 6]  ; доступ к младшему слову
arg_high  EQU word ptr [bp + 8]  ; доступ к старшему слову
arg			EQU dword ptr [bp + 6]; на всякий случай, но вряд ли пригодится в 16-и разрядном ассемблере

push bp
mov bp, sp
...	  ; действия функции, например, mov cx, arg_low и т. д.
mov ax, (смещение начала возвращаемой строки)
mov dx, (сегмент возвращаемой строки, если описана как дальняя)
pop bp; не забываем восстановить старое значение bp
ret 4  ; очистка стека
F endp
Замечание 1. Если Паскалевский компилятор помещает двойное слово в обратном порядке, то, естественно,
Код:
arg_low EQU word ptr [bp + 8]
arg_high EQU word ptr [bp + 6]
а arg уже не работает.
Замечание 2. Если процедура близкая, из определений надо вычесть сегмент возврата (минус 2).
Замечание 3. Следим за регистром букв, для компоновщика это важно, при компиляции и ассемблировании выставляем соответствующие ключи.
Замечание 4. Строки в Паскале: массив 256 байт, первый байт == количество символов.
Читай книгу: В. Н. Пильщиков Assembler. По переводу чисел между системами ищи в инете, выложены кучи алгоритмов.
 
S

SESERU

#6
Народ не подскажите. Все эдементарные тексты. не линкуются. объектный файл создается правда какоето сообшение выдает. использую TASM32. видно нужно просто обычный TASM. и еще разницы же нет при написании для атлона64?
 
I

Igorg

#7
Какое сообщение выдает?
Просто есть разница между тремя целями -- программа для реального режима (16-и битный), защищенного (32-х битный) и защищенного 64 разрядного (атлон64). Лучше почитать интелловские и амдэшные мануалы по этому поводу.
 
N

Natasya

#8
Помогите пожалуйста, вторую неделю мучаюсь
Задача отсортировать массив записай (на ассемблере) по номера телефонов (по возрастанию) и вывести этот ассив записей до сортировки и после. Собственно саму сортировку телефонов и вывод я сделала. А вот чтобы ещё и строки менялись незнаю что и делать. Вобщем вот что я написала:

Код:
sseg segment stack 'stack'
dw 256 dup(?)
sseg ends

data segment
str1 db 10,13,'Telephone­: $'
str2 db 10,13,'Name: $'
str3 db 10,13,'Sort array of record: $'
mes db 10,13,'Nosort array of record: $'
spacer db 10,13,'Press ENTER $'
telephone struc
name_ db 256 dup(0)
number_ dd ?
ends
tempstr db 256 dup(0)
mas_tel telephone <"Name1",567878>
telephone <"Name2",435654>
telephone <"Name3",342345>
telephone <"Name4",123456>
telephone <"Name5",431233>
telephone <"Name6",123434>
telephone <"Name7",128978>
telephone <"Name8",346467>
telephone <"Name9",128888>
telephone <"Name10",345656>
temp dd ?
data ends

code segment
assume cs:code,ds:data,es:data,ss:sseg
start: mov ax,data
mov ds,ax
mov es,ax
.386
call begin_init
mov cx,10
mov dx,offset mes
mov ah,09h
int 21h
call output_telephone

lea dx,spacer
mov ah,09h
int 21h
mov ah,1h
int 21h

mov cx,9
call begin_init
sortirovka: call sort
call begin_init
loop sortirovka
call begin_init
mov cx,10
push ax
push dx
mov dx,offset str3
mov ah,09h
int 21h
pop dx
pop ax
call output_telephone

mov ah,4ch
int 21h

output_telephone proc
o_tel: lea dx,str2
mov ah,09h
int 21h
lea si,[di].name_
dalee1:
lodsb
cmp al,0
jle exit
mov dl,al
mov ah,02h
int 21h
jmp dalee1
exit: 
lea dx,str1
mov ah,9h
int 21h
mov eax,[di].number_
push ecx
xor ecx,ecx
push ebx
mov ebx,10
loop1:	xor edx,edx
div ebx
add dl,30h
push dx
inc cl
cmp eax,ebx
jnl loop1
add al,30h
push ax
inc cl
xor eax,eax
mov ah,02h
loop2:	pop dx
int 21h
loop loop2
pop ebx
pop ecx
add di,bx
loop o_tel
ret
output_telephone endp

begin_init proc
mov bx,type telephone
lea di,mas_tel
ret
begin_init endp

input_tel proc
push eax
push ebx
push ecx
push edx
xor eax,eax
xor edx,edx
mov cx,6
mov bx,10
mov temp,00000000h
comon: xor eax,eax
mov ah,1h
int 21h
sub al,30h
mov ah,00h
add edx,eax
mov eax,edx
push edx
xor edx,edx
mul ebx
pop edx
mov edx,eax
loop comon
xor edx,edx
div ebx
mov temp,eax
pop edx
pop ecx
pop ebx
pop eax
ret
input_tel endp

sort proc
push cx
L1: mov eax,[di].number_
mov edx,[di+bx].number_
cmp eax,edx
jl dalee
mov [di].number_,edx
mov [di+bx].number_,eax
;	 а в этом месте должен быть следующий обмен
;	 tempstr <- [di].name_
;	 [di].name_ <- [di+bx].name_
;	 [di+bx].name_ <- tempstr
;	 а как это сделать не знаю
dalee:
add di,bx
loop L1
pop cx
ret
sort endp  

code ends
end start
Помогите пожалуйста
 
P

Pete

#9
2Natasya:

К сожалению, кода на асме вам не дам, так как было давно да и времени честно говоря нет. Но могу дать совет. Вам стоит создать (выделить динамически или статически в data сегменте) массив адресов структур аналогично в С telephone* array[N]. Т.е. у вас должен быть массив размером 4 * N байт (для 32-х битной архитектуры). Затем заполнить его взяв адрес первой структуры и увеличивая его в цикле на размер структуры (256+4=260 байт). После этого вам надо переписать функцию сортировки так, чтобы вместо перестановки элементов структур вы переставляли элементы (адреса) в массиве адресов. Т.е. вам всего лишь надо будет переставлять 32-битные значения в массиве, вместо копирования строк и чисел, что значительно быстрее и красивее, так как за одну перестановку вы меняете местами сразу и строку и номер телефона. Думаю препод будет вами восхищен ;-)
Будь я преподавателем за копирование вместо перестановки адресов я бы поставил 3-ку - за усердие :)
Если возникнут вопросы - спрашивайте, постараюсь помочь.
 
N

Natasya

#10
2Pete
Изначально я всё так и сделала, меня поправил преподаватель, дескать у вас милочка в задании чёрным по белому "перестановка строк" а не адресов. Я начала возущаться, сама считаю что гораздо легче и эффективнее - перестановка адресов. Эх, а сперестановкой строк не могу разобраться. Пробовала писать:
Код:
.
.
.
sort proc
push cx
L1: mov eax,[di].number_
mov edx,[di+bx].number_
cmp eax,edx
jl dalee
mov [di].number_,edx
mov [di+bx].number_,eax

lea si,[di].name_
push di
lea di,tempstr
call copystr
pop di

lea si,[di+bx].name_
push di
lea di,[di].name_
call copystr
pop di

lea si,tempstr
push di
lea,[di+bx].name_
call copystr
pop di

dalee:
add di,bx
loop L1
pop cx
ret
sort endp  

copystr proc
push cx
mov cx,256
copy_s: lodsb
stosb
loop copy_s
pop cx
ret
copystr endp
.
.
.
программа досрочно завершается :)
вот, теперь не знаю что и делать
 
P
#11
Ну раз такие дела... дебагить надо.

Надеюсь этого в коде нет? :)

lea si,tempstr
push di
lea,[di+bx].name_
call copystr
pop di

И еще вопрос от чего зависит используется cx или ecx при вызове loop (16-битная адресация???)? Может так случиться, что старшая часть не очищается и из-за этого происходит выход за границы сегмента? Спрашиваю потому, что по логике все правильно в sort proc, ошибку даже не с первого взгляда найти не могу.
 
N

Natasya

#12
<!--QuoteBegin-Pete+10:04:2007, 22:42 -->
<span class="vbquote">(Pete @ 10:04:2007, 22:42 )</span><!--QuoteEBegin-->Надеюсь этого в коде нет?

lea si,tempstr
push di
lea,[di+bx].name_
call copystr
pop di
[snapback]62040" rel="nofollow" target="_blank[/snapback]​
[/quote]
нет конечно, это я так, опечатка получилась.

<!--QuoteBegin-Pete+10:04:2007, 22:42 -->
<span class="vbquote">(Pete @ 10:04:2007, 22:42 )</span><!--QuoteEBegin-->используется cx или ecx при вызове loop (16-битная адресация???)?
[snapback]62040" rel="nofollow" target="_blank[/snapback]​
[/quote]
если указать .386 или ещё старше то будет использоваться есх, если младше то просто сх, вроде так. Но тут ошибки нет, проверено дебагером.

Сегодня ещё посидела, помучалась. Переписала всю процедуру сортировки, сделала копирование по всему полю 260 байт. Всё таки получилося. Теперь всё работает.
Большое спасибо за советы )))
 
P

Ploxish

#13
Люди, помогите пожалуйста, надоело уже этот асм ковырять, посмотрите где тут ошибки

Код:
;Zadanie в данной строке удвоить гласные и записать вместо двойной согласной 

;одинарную
model small
.data
zapros	db 'vvedite stroky',0ah,0dh,'$'
stroka	db 100,?,101 dup(?)
stroka2  db 100 dup(?)
glasnye  db 'aeioyAEIOY',0ah,0dh,'$'
soglasnye db 'bcdfghjklmnpqrstuvwxz',0ah,0dh,'$'
len	  dw (?)
sog	  dw (?)
.stack 
db 256 dup(?)
.code
start:
mov ax,@data
mov ds,ax
mov es,ax
mov ax,@stack
mov ss,ax
mov ah,09h				 ;vivodim zapros
lea dx,zapros
int 21h 

xor si,si
l1:					 
mov ah,soglasnye[si]		  
inc si					  
cmp ah,'$'				  
jne l1				  
dec si
mov sog,si 

xor si,si				  
readkey:
mov ah,1				  
int 21h
mov stroka[si],al		 
inc si					 
cmp al,13				 
jne readkey				
mov stroka[si],'$' 
xor si,si
label1:					 
mov ah,glasnye[si]		  
inc si					  
cmp ah,'$'				  
jne label1				  
dec si
mov len,si 

xor si,si				 ;ydvoenie glasnoy
xor bx,bx
m2:
cld						 
mov cx,len
lea di,glasnye
mov al,stroka[si]		  
repne scasb
jne t2
mov stroka2[bx],al 
inc bx
mov stroka2[bx],al
cmp al,'$'
inc si
inc bx
jne m2
jmp vix

;obrabotka sogl
t2:
cld						 
mov cx,sog
lea di,soglasnye
mov al,stroka[si]		  
mov dl,al
repne scasb
jne t4
mov al,stroka[si+1]
cmp al,dl		  
jne t3			  

mov stroka2[bx],' '
jmp t4
t3:
mov stroka2[bx],dl

t4:
inc si
inc bx
cmp al,'$'
jne m2
mov stroka2[si+1],'$'
vix:


mov ah,09h				 ;vivodim stroky
lea dx,stroka2
int 21h 
mov ah,1
zaderjka:
int 21h
cmp al,27				 
jne zaderjka

mov ax,4c00h		 ; Exit
int 21h			; Exit
end start
 
Статус
Закрыто для дальнейших ответов.