1. Наш канал codeby в telegram. Пишем об информационной безопасности, методах защиты информации, о программировании. Не пропускай новости с кодебай, будь в тренде ! Подробнее ...

    Скрыть объявление

Ассемблер

Тема в разделе "Остальные языки программирования", создана пользователем -, 15 фев 2007.

Статус темы:
Закрыта.
  1. Гость

    Репутация:
    0
    программа должна работать (пример из методички). Когда запускаю файл .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
     
  2. Maxx

    Maxx Гость

    Репутация:
    0
    добавить стек или создавать com файл

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

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

    Igorg Гость

    Репутация:
    0
    <!--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, его запускай.
     
  4. Katia+

    Katia+ Гость

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

    Igorg Гость

    Репутация:
    0
    Я в Паскале не специалист, могу предложить вот что (все нижеописанное касается только 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. По переводу чисел между системами ищи в инете, выложены кучи алгоритмов.
     
  6. SESERU

    SESERU Гость

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

    Igorg Гость

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

    Natasya Гость

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

    Код:
    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
    Помогите пожалуйста
     
  9. Pete

    Pete Гость

    Репутация:
    0
    2Natasya:

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

    Natasya Гость

    Репутация:
    0
    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
    .
    .
    .
    программа досрочно завершается :)
    вот, теперь не знаю что и делать
     
  11. Pete

    Pete Гость

    Репутация:
    0
    Ну раз такие дела... дебагить надо.

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

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

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

    Natasya Гость

    Репутация:
    0
    <!--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 байт. Всё таки получилося. Теперь всё работает.
    Большое спасибо за советы )))
     
  13. Ploxish

    Ploxish Гость

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

    Код:
    ;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
     
  14. Ploxish

    Ploxish Гость

    Репутация:
    0
    Все работает, извините за беспокойство : )
     
Загрузка...
Статус темы:
Закрыта.

Поделиться этой страницей