Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [Assembler] Преобразовать из 16-битной в 32-битную программу


Автор: lamersfear 11.1.2009, 18:40
Здраствуйте ув. Форумчане! В общем суть такова, была написана 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 

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

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

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


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

Автор: lamersfear 13.1.2009, 21:10
Написана частично мной, будут полезны любые советы!!! Или готовый код!

Автор: airyashov 14.1.2009, 10:27
вот пример по 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

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


KOD внизу: 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)