Ассемблер

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

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

    программа должна работать (пример из методички). Когда запускаю файл .obj выводится warning - No stack. Что делать?
    Код (Text):
    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 Гость

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

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

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

    Igorg Гость

    <!--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]
    Что это значит? Рано объекный файл запускать, надо компоновщиком преобразовать его в исполняемый.
    Код (Text):
    stseg  segment para stack
    dw   16  dup(?)
    stseg  ends
    В исходном тексте стек описан, этого должно быть достаточно (правда, размер стека маловат, рекомендуют минимум 100h).
    Масмом:
    ml /c file.asm
    link file.obj
    сформируется file.exe, его запускай.
     
  4. Katia+

    Katia+ Гость

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

    Igorg Гость

    Я в Паскале не специалист, могу предложить вот что (все нижеописанное касается только 16-и разрядной архитектуры):
    Имеем, скажем, такую функцию:
    Код (Text):
    function f(arg: LongInt): String; far;
    Вызываем ее, в стек помещается сначала старшее слово arg, затем его младшее слово (либо наоборот, это надо дебагом посмотреть). Затем в стек помещается адрес возврата (два слова для дальней подпрограммы) и осуществляется переход на первую команду подпрограммы. В ассемблере:
    Код (Text):
    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. Если Паскалевский компилятор помещает двойное слово в обратном порядке, то, естественно,
    Код (Text):
    arg_low EQU word ptr [bp + 8]
    arg_high EQU word ptr [bp + 6]
    а arg уже не работает.
    Замечание 2. Если процедура близкая, из определений надо вычесть сегмент возврата (минус 2).
    Замечание 3. Следим за регистром букв, для компоновщика это важно, при компиляции и ассемблировании выставляем соответствующие ключи.
    Замечание 4. Строки в Паскале: массив 256 байт, первый байт == количество символов.
    Читай книгу: В. Н. Пильщиков Assembler. По переводу чисел между системами ищи в инете, выложены кучи алгоритмов.
     
  6. SESERU

    SESERU Гость

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

    Igorg Гость

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

    Natasya Гость

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

    Код (Text):
    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 Гость

    2Natasya:

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

    Natasya Гость

    2Pete
    Изначально я всё так и сделала, меня поправил преподаватель, дескать у вас милочка в задании чёрным по белому "перестановка строк" а не адресов. Я начала возущаться, сама считаю что гораздо легче и эффективнее - перестановка адресов. Эх, а сперестановкой строк не могу разобраться. Пробовала писать:
    Код (Text):
    .
    .
    .
    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 Гость

    Ну раз такие дела... дебагить надо.

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

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

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

    Natasya Гость

    <!--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 Гость

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

    Код (Text):
    ;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 Гость

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

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