Модераторы: Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [Assembler] Преобразовать из 16-битной в 32-битную программу, Помогите подправить код 
:(
    Опции темы
lamersfear
Дата 11.1.2009, 18:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Здраствуйте ув. Форумчане! В общем суть такова, была написана 16-битная программа , но преподователь отказался ее принимать, аргументировал тем что она под ДОС, а нужно 32-бит Виндовс МАСМ. Прошу помочь подправить данный код в соответствии с требованиями (32-бит Windows).

Код

; Начало программы
org    100h
jmp    Start

Start    proc
    ; Матрица 1
    mov    ah, 09h
    mov    dx, offset mbMesX
    int    21h
    
    mov    bx, offset mbMatrix1  
    call    FMatrixPrint

    call    FRet
    
    ; Матрица 2
    mov    ah, 09h
    mov    dx, offset mbMesX
    int    21h
    
    mov    bx, offset mbMatrix2 
    call    FMatrixPrint

    call    FRet
    
    ; Вызов процедуры умножения
    call    FMatrixR_Format
    
    ; Результирующая матрица 
    mov    ah, 09h
    mov    dx, offset mbMesR
    int    21h
    
    mov    bx, offset mbMatrixR
    call    FMatrixPrint

    call    FRet
    
    ; ожидаем нажатия на клавишу
    mov    ah, 0
    int    16h

    ret
endp    
    
; Перемножение матриц
FMatrixR_Format proc
    ; сохраняем регистры
    push    ax
    push    bx
    push    cx
    ; устанавливаем порядковый номер элемента = 0
    mov    cx, 0
    
FMatrixR_Format_5:
    lea    bx, mbMatrix1    ; загружаем смещение матрицы 1
    add    bx, cx        ; прибавляем порядковый номер элемента
    mov    dl, [bx]        ; загружаем элемент
    
    mov    ah, 0
    lea    bx, mbMatrix2    ; загружаем смещение матрицы 2
    add    bx, cx        ; прибавляем порядковый номер элемента
    mov    al, [bx]        ; загружаем элемент
    
    mul    dl        ; операция умножения
    
    lea    bx, mbMatrixR    ; загружаем смещение матрицы для результата
    add    bx, cx        ; прибавляем порядковый номер элемента
    mov    [bx], al        ; сохраняем елемент
    
    inc    cx        ; переходим на след элемент
    cmp    cx, 9        ; проверяем окончание количества элементов в матрице
    jb    FMatrixR_Format_5    
    
    ; восстанавливаем регистры
    pop    cx        
    pop    bx
    pop    ax
    ret
endp


    
; Переход на новую строку
FRet    proc
    push    ax
    push    dx
    mov    ah, 02h
    mov    dl, 0ah        ; вниз
    int    21h
    mov    dl, 0dh        ; назад
    int    21h
    pop    dx
    pop    ax
    ret
endp



; Очистка строки
FS3_Space    proc
    push    bx
    push    cx        ; сохраняем
    lea    bx, mbS3
    mov    ch, 0        ; устанавливаем количество элементов
    mov    cl, bSizeS3
FS3_Space_5:    
    mov    [bx], ' '        ; заполняем массив пробелами
    inc    bx
        loop    FS3_Space_5
    pop    cx        ; восстанавливаем
    pop    bx
    ret
endp



; Вывод строки S3
FS3_Print    proc
    ; сохраняем регистры
    push    ax
    push    dx
    ; печать строки
    mov    ah, 09h
    mov    dx, offset mbS3
    int    21h
    ; восстанавливаем регистры    
    pop    dx        
    pop    ax
    ret
endp
    
    
    
; Формирование строки S3 из регистра AL
FS3_ALOut    proc
; сохраняем все регистры
    push    ax
    push    bx
    push    cx
    push    dx
; очистка поля
    call    FS3_Space
; ограничение на 1 байт чмсла    
    mov    ah, 0        
    lea    bx, mbS3
; сотни
    cmp    al, 100
    jb    FS3_ALOut_5
    mov    dl, 100        ; делим на 100
    div    dl
    mov    [bx], al
    add    [bx], 48
    mov    al, ah        ; устанавливаем остаток как результат
    mov    ah, 0        ; стираем ненужную часть
FS3_ALOut_5:
; десятки    
    inc    bx
    cmp    al, 10
    jb    FS3_ALOut_6
    mov    dl, 10        ; делим на 10
    div    dl
    mov    [bx], al
    add    [bx], 48
    mov    al, ah        ; устанавливаем остаток как результат
FS3_ALOut_6:
; единицы
    inc    bx
    mov    [bx], al
    add    [bx], 48    
; восстанавливаем все регистры    
    pop    dx        
    pop    cx
    pop    bx
    pop    ax
    ret
endp



; Печать матрицы: BX - начало матрицы
FMatrixPrint proc
    push    ax        ; сохраняем AX
    push    bx        ; сохраняем BX, чтобы не изм. вх. параметр
    
    ; первая строка
    mov    al, [bx]        ; загрузка начального символа
    call    FS3_ALOut        ; формирование числа
    call    FS3_Print        ; печать буфера
    call    FS3_Space        ; очистка буфера
    call    FS3_Print        ; печать буфера
    inc    bx        ; переход на след. символ матрицы
    
    mov    al, [bx]        ; загрузка следующего символа
    call    FS3_ALOut        ; формирование числа
    call    FS3_Print        ; печать буфера
    call    FS3_Space        ; очистка буфера
    call    FS3_Print        ; печать буфера
    inc    bx        ; переход на след. символ матрицы
    
    mov    al, [bx]
    call    FS3_ALOut        ; формирование числа
    call    FS3_Print        ; печать буфера
    inc    bx        ; переход на след. символ матрицы
    
    call    FRet        ; переход на новую строку
    
    ; вторая строка
    mov    al, [bx]
    call    FS3_ALOut        ; формирование числа
    call    FS3_Print        ; печать буфера
    call    FS3_Space        ; очистка буфера
    call    FS3_Print        ; печать буфера
    inc    bx        ; переход на след. символ матрицы
    
    mov    al, [bx]
    call    FS3_ALOut        ; формирование числа
    call    FS3_Print        ; печать буфера
    call    FS3_Space        ; очистка буфера
    call    FS3_Print        ; печать буфера
    inc    bx        ; переход на след. символ матрицы
    
    mov    al, [bx]
    call    FS3_ALOut        ; формирование числа
    call    FS3_Print        ; печать буфера
    inc    bx        ; переход на след. символ матрицы
    
    call    FRet        ; переход на новую строку
    
    ; третья строка
    mov    al, [bx]
    call    FS3_ALOut        ; формирование числа
    call    FS3_Print        ; печать буфера
    call    FS3_Space        ; очистка буфера
    call    FS3_Print        ; печать буфера
    inc    bx        ; переход на след. символ матрицы
    
    mov    al, [bx]
    call    FS3_ALOut        ; формирование числа
    call    FS3_Print        ; печать буфера
    call    FS3_Space        ; очистка буфера
    call    FS3_Print        ; печать буфера
    inc    bx        ; переход на след. символ матрицы
    
    mov    al, [bx]
    call    FS3_ALOut        ; формирование числа
    call    FS3_Print        ; печать буфера
    inc    bx        ; переход на след. символ матрицы
    
    call    FRet        ; переход на новую строку
    
    pop    bx        ; восстанавливаем BX
    pop    ax        ; восстанавливаем AX
    ret
endp


mbMatrix1    db    0, 1, 2, 3, 4, 5, 6, 7, 8
mbMatrix2    db    8, 7, 6, 5, 4, 3, 2, 1, 0
mbMatrixR    db    0 dup (0)

mbMesX    db    "Исходная матрица:", 0Dh, 0Ah, "$"
mbMesR    db    "Результирующая матрица:", 0Dh, 0Ah, "$"

bSizeS3    db    3
mbS3    db    '1', '2', '3', '$'


Заранее благодарен!  smile 
PM MAIL   Вверх
dumb
Дата 11.1.2009, 22:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 6
Всего: 158



Цитата(lamersfear @  11.1.2009,  18:40 Найти цитируемый пост)
была написана 16-битная программа

Цитата(lamersfear @  11.1.2009,  18:40 Найти цитируемый пост)
Прошу помочь подправить данный код

так как написана она была не тобой, то какие-то общие рекомендации тебе не помогут. а чтобы "подправить" код, его надо написать заново с 0.


M
dumb
Тема перенесена!


Это сообщение отредактировал(а) dumb - 11.1.2009, 22:37
PM MAIL   Вверх
lamersfear
Дата 13.1.2009, 21:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Написана частично мной, будут полезны любые советы!!! Или готовый код!
PM MAIL   Вверх
airyashov
Дата 14.1.2009, 10:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



вот пример по Windows
Код

.586
.model flat,stdcall
;подключение файлов и библиотек
include    file.inc
include    E:\masm32\include\user32.inc
include    E:\masm32\include\kernel32.inc
include    E:\masm32\include\msvcrt.inc

;прототипы функций
PrintStr    proto    :DWORD,:DWORD
LENSTR        proto    :DWORD
ReadSymbol    proto    :DWORD,:DWORD,:DWORD

;объявление переменных
.data
    consoleOutHandle    dd    ?
    consoleInHandle        dd    ?
    TITL                db    "Программа",0
    in_str                db    "Введите строку: ",0
    buf                    db    200 dup(0)        ;указатель на исходную строку (200 символов)
    dst                    db    200 dup(0)        ;указатель на строку результат (тож 200)
    len                    dd    ?                ;длина исходной строки
    numBytes            dd ?
    count                dd 0                ;счетчик цикла

.code
main    proc

    ;создание консоли
    invoke    FreeConsole
    invoke    AllocConsole
    
    invoke    GetStdHandle,STD_INPUT_HANDLE
    mov        consoleInHandle,eax
    
    invoke    GetStdHandle,STD_OUTPUT_HANDLE
    mov        consoleOutHandle,eax
    
    ;ввод исходной строки
    invoke    CharToOem,offset TITL,offset TITL
    invoke    SetConsoleTitle,offset TITL
    invoke    PrintStr,offset in_str,consoleOutHandle
    invoke    ReadConsole,consoleInHandle,offset buf,200,offset len,0
    
    cld                    ;обнуление текущих значений
    lea        edi,dst        ;инициализация указателя адресом строки-результата
    lea        esi,buf        ;инициализация указателя адресом исходной строки
    xor        ecx,ecx        ;обнуление ecx
    
    ;начало цикла поиска
    @l:
    mov        ebx,[esi]    ;в ebx помещаем то, сто было в eci
    cmp        bl,'s'        ;сравнение текущего символа с 's'
    jne        @nots        ;переход на @nots в случае неравенства
    mov        [edi],bl    ;в случае равенства запись текущего символа в строку результат
    inc        edi            ;переход к следующему символу
    
    @nots:
    cmp        bl,'a'        ;сравнение текущего символа с 'a'
    jne        @nota        ;переход на @nota в случае неравенства
    mov        [edi],bl    ;в случае равенства запись текущего символа в строку результат
    inc        edi            ;переход к следующему символу
    
    @nota:
    
    inc        esi            ;переход к следующему символу
    inc        ecx            ;увеличение на 1 счетчика
    cmp        ecx,len        ;цикл выполняется до тех пор пока ecx не будет равно длине заданной строки
    jne        @l
    ;конец цикла поиска
    
    ;вывод строки-результата
    invoke    LENSTR,offset dst
    invoke    WriteConsole,consoleOuthandle,offset dst,eax,offset numBytes,0
    invoke    ReadSymbol,consoleInHandle,consoleOutHandle,1
    
    invoke    ExitProcess,0
main    endp
end        main



--------------------
icq:3(один)7748666
mail:airyashov( а )inbox.ru
PM MAIL   Вверх
Rusinho
Дата 25.5.2009, 21:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



доброго времени суток. 
программа была написана для "AVR Butterfly". 
Работает примерно так: 
   сначала вводится первое число и оно отоброжается на мониторе, а затем второе число также. потом должно отображаться их сумма со знаком. 
у меня есть код программы , надо подправить на 32 битовый. Помогите кто чем может (Курсовая горит :((( ). СПАСИБО.  


KOD внизу: 

Присоединённый файл ( Кол-во скачиваний: 4 )
Присоединённый файл  16b_adder.asm 2,38 Kb
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

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

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


 




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


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

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