Поиск:

Ответ в темуСоздание новой темы Создание опроса
> локальные переменные, чет не пойму 
V
    Опции темы
Logree
Дата 23.11.2010, 05:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 331
Регистрация: 22.11.2006
Где: Самара

Репутация: нет
Всего: 2



возникла у меня нужда вывести некое число на экран, я открыл Юрова, нашел пример такого кода (Юров Ассемблер Практикум с.213) но там у него это оформленно програмкой, а я хотел сделать по-человечески и переработал этот код в процедуру, но вот что-то не так, выводит оно совсем не то что хотелось бы, думаю дело в локальных переменных:
Код

;------------------------------
; функция вывода числа на экран
; вход: dword
; выход: печать числа
;------------------------------
printn:

string_bin_dword        equ [bp+6]            ; входной параметр - число
string_pack                equ [bp-10]            ; локальная переменная dt
string                    equ [bp-30]            ; локальная переменная 20 dup(?)

len_string_pack            = 0Ah
len_string                = 14h
    push    bp
    mov        bp,sp            ; формируем стековый фрейм
    sub        sp,30            ; выделяем 30 байт для локальных переменных    
    

    finit                                ; обнуляем сопроцессор
    fild    DWORD PTR string_bin_dword    ; заносим в сопроцессор двоичное
                                        ; челое число
    fbstp    TBYTE PTR string_pack        ; извлекаем упакованое BCD
    
    ; распаковываем результат    
    ;lds        si,adr_string_pack  <- эту строку я заменил на следующие, скажите если можно этого не делать
    mov        ax,ss
    mov        ds,ax
    lea        si, TBYTE PTR string_pack    
    add        si,len_string_pack - 2        ; si указывает на конец string_pack
                                        ; 18 десятичных цыфр
    ;les        di,adr_string
    mov        es,ax
    lea        di, string                    ; di указывает адрес строки куда распаковывать
    mov        cx,9                        ; распаковываем по 2 байта всего 9 пар
cycl:
    xor        ax,ax
    std                                    ; устанавливаем флаг направления
                                        
    lodsb                                ; в al очередные 2 упакованые цыфры
    
    ; распаковываем - ah = младшая, al = старшая    
    shl        ax,4
    rol        al,4
    or        ax,3030h        ; преобразуем в симфольное представление
    xchg    ah,al            ; ah = младшая, al = старшая
    cld                        ; очищаем флаг переноса
    stosw
    loop    cycl
    
    ; выводим распакованое число на консоль
    xor        bx,bx            
    inc        bx                
    mov        cx,len_string        
    ;lds        dx,adr_string
    mov        ax,ss                 
    mov        ds,ax                
    lea        dx,string            
    mov        ah,40h                
    int        21h
    
    mov        sp,bp                
    pop        bp                    
    ret        4                    
    ; end printn


...
       ; dx:ax
       xor    dx,dx
       mov   ax,0897h ; magic num
       mov        WORD PTR filesize,ax        ; младший байт по младшему адресу
    mov        WORD PTR [filesize+2],dx    ; сташий байт    
    
    push    DWORD PTR filesize        
    call    printn                                               ; должно выводить 2199



посмотрел в отладчике, после этой инструкции в стеке совсем не то что должно в нем быть, хотя изменяются нужные байты
Код

fbstp    TBYTE PTR string_pack    

может тогда я параметру ни то смещение дал? подскажите где я намудрил?

Это сообщение отредактировал(а) Logree - 23.11.2010, 05:03


--------------------
Самый распространенный способ дебага пятиста строк ассемблерного кода - очень долгий, очень пристальный и очень задумчивый взгляд.
PM MAIL ICQ   Вверх
500mhz
  Дата 25.11.2010, 13:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


шайтан
***


Профиль
Группа: Завсегдатай
Сообщений: 1017
Регистрация: 5.5.2008
Где: Киев / Italy

Репутация: 1
Всего: 14



а что за компилятор?


на фасме попробуй только printn правильно оформи


proc printn, var1,var2,var3


        ret
endp


пс
push    bp
    mov        bp,sp            ; формируем стековый фрейм
    sub        sp,30            ; выделяем 30 байт для локальных переменных    
====
 mov        sp,bp                
    pop        bp                    
    ret        4         
в фасме этого не нада оно само фрейм сделает


--------------------

PM MAIL ICQ   Вверх
Logree
Дата 26.11.2010, 01:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 331
Регистрация: 22.11.2006
Где: Самара

Репутация: нет
Всего: 2



с каких это пор fasm сам фрейм создаёт? ну в общем-то не важно, тут все оформлено как нужно(tasm), мне интересно где ошибка? я так пнимаю код вы не смотрели...


--------------------
Самый распространенный способ дебага пятиста строк ассемблерного кода - очень долгий, очень пристальный и очень задумчивый взгляд.
PM MAIL ICQ   Вверх
500mhz
Дата 26.11.2010, 01:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


шайтан
***


Профиль
Группа: Завсегдатай
Сообщений: 1017
Регистрация: 5.5.2008
Где: Киев / Italy

Репутация: 1
Всего: 14



Код

mov        WORD PTR filesize,ax        ; младший байт по младшему адресу
    mov        WORD PTR [filesize+2],dx    ; сташий байт    




пс
а фасм всю жись фреймы делал автоматом




--------------------

PM MAIL ICQ   Вверх
Logree
Дата 26.11.2010, 01:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 331
Регистрация: 22.11.2006
Где: Самара

Репутация: нет
Всего: 2



а что не так в этом куске? то что там написано БАЙТ это "описка" естественно СЛОВО.


--------------------
Самый распространенный способ дебага пятиста строк ассемблерного кода - очень долгий, очень пристальный и очень задумчивый взгляд.
PM MAIL ICQ   Вверх
500mhz
Дата 26.11.2010, 12:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


шайтан
***


Профиль
Группа: Завсегдатай
Сообщений: 1017
Регистрация: 5.5.2008
Где: Киев / Italy

Репутация: 1
Всего: 14



я к тому что там по моему скобок не хватает, хотя синтаксис тасма , кто его знает.


--------------------

PM MAIL ICQ   Вверх
Logree
Дата 27.11.2010, 09:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 331
Регистрация: 22.11.2006
Где: Самара

Репутация: нет
Всего: 2



smile исправил 
Код

mov        WORD PTR filesize,ax        ; младший байт по младшему адресу
    mov        WORD PTR filesize+2,dx    ; сташий байт  

все равно не работает.

проблема тут
Код

[bp+6]->[bp+4]

для тех кому интересно
Код

.model small
.stack 100h
.data
filesize    dd 07FFFFFFFh
.code

printd:

bin_dword                equ [bp+4]            ; âõîäíîé ïàðàìåòð - ÷èñëî
bcd_string                equ [bp-10]            ; ëîêàëüíàÿ ïåðåìåííàÿ dt ?
string                    equ [bp-20]            ; ëîêàëüíàÿ ïåðåìåííàÿ 10 dup(?)
bcd_string_len            = 05h                ; ðåçóëüòàò ñîõðàíèòüñÿ â ïåðâûõ
                                            ; ïÿòè áàéòàõ
string_len                = 0Ah
    push    bp
    mov        bp,sp            ; ôîðìèðóåì ñòåêîâûé ôðåéì
    sub        sp,20            ; âûäåëÿåì 20 áàéòà äëÿ ëîêàëüíûõ ïåðåìåííûõ
    
    fild    DWORD PTR bin_dword    ; çàíîñèì â ñîïðîöåññîð äâîè÷íîå
                                        ; öåëîå ÷èñëî    
    fbstp    TBYTE PTR bcd_string        ; èçâëåêàåì óïàêîâàíîå BCD
    
    ; ðàñïàêîâûâàåì ðåçóëüòàò    
    mov        ax,ss
    mov        ds,ax
    lea        si, TBYTE PTR bcd_string    
    add        si,bcd_string_len - 1        ; si óêàçûâàåò íà êîíåö string_pack
                                        ; 18 äåñÿòè÷íûõ öûôð
    mov        es,ax
    lea        di, string                    ; di óêàçûâàåò àäðåñ ñòðîêè êóäà ðàñïàêîâûâàòü
    mov        cl,4
    mov        dx,5                        ; ðàñïàêîâûâàåì ïî 2 áàéòà âñåãî 5 ïàð
unpuck:
    xor        ax,ax
    std                                    ; óñòàíûâëèâàåì ôëàã íàïðàâëåíèÿ
                                        ; ÷òîáû çàïèñûâàòü ÷èñëà â êîíåö ñòðîêè
    lodsb                                ; â al î÷åðåäíûå 2 óïàêîâàíûå öûôðû    
    ; ðàñïàêîâûâàåì - ah = ìëàäøàÿ, al = ñòàðøàÿ    
    ror        ax,cl
    shr        ah,cl
    or        ax,3030h        ; ïðåîáðàçóåì â ñèìâîëüíîå ïðåäñòàâëåíèå
                            ; ah = ìëàäøàÿ, al = ñòàðøàÿ
    cld                        ; î÷èùàåì ôëàã íàïðàâëåíèÿ
    stosw
    dec        dx
    test    dx,0FFFFh
    jnz        unpuck
    
    ; âûâîäèì ðàñïàêîâàííîå ÷èñëî íà êîíñîëü
    xor        bx,bx            ; mov    bx,0
    inc        bx                ; 1 - ñòàíäàðòíûé äåñêðèïòîð ýêðàíà
    mov        cx,string_len        
    mov        ax,ss                ; ôîðìèðóåì óêàçàòåëü íà 
    mov        ds,ax                ; ñòðîêó string
    lea        dx,string            ; â ds:dx
    mov        ah,40h                ; íîìåð ôóíêöèè çàïèñè
    int        21h
    
    mov        sp,bp                ; âûòàëêèâàåì ëîêàëüíûå ïåðåìåííûå
    pop        bp                    
    ret        4                    ; âûòàëêèâûåì ïàðàìåòð
    ; end printn

;------------------------
; ìåòêà âõîäà â ïðîãðàììó
;------------------------
begin:
    mov        ax,@data
    mov        ds,ax
    
    push    DWORD PTR filesize
    call    printd
    
    xor        ax,ax
    int        16h
    ; âûõîä
    mov        ax,4c00h
    int        21h
    

    
end begin


Это сообщение отредактировал(а) Logree - 27.11.2010, 12:44


--------------------
Самый распространенный способ дебага пятиста строк ассемблерного кода - очень долгий, очень пристальный и очень задумчивый взгляд.
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Asm для начинающих"
MAKCim
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой КОД.
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Asm для начинающих | Следующая тема »


 




[ Время генерации скрипта: 0.0675 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.