Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 30.11.2019, 16:11   #1
Illtry
Пользователь
 
Регистрация: 09.02.2018
Сообщений: 22
По умолчанию Ассемблер и Delphi

Здравствуйте. Задание формулируется таким образом: процедура выполняет транспонирование матрицы m×n, матрица состоит из чисел типа integer. Вход: адрес матрицы-источника (размерности m×n), адрес матрицы-приемника (размерности n×m), числа m и n. Выход: нет.
Программу транспонирования на ассемблере прикладываю ниже. Подскажите, пожалуйста, как "прикрутить" это к Delphi? Хотя бы принцип: не особо понимаю, а хотелось бы разобраться.

Код:
model small
.486
LOCALS @@
.stack  256
.data
Metric   equ   10              ;???? ??????

Rows     equ    4              ;???????? ??????? ???
Columns  equ    4              ;???????? ??????? ????
arSize   equ    Rows*Columns   ;???????? ???? ??????

m        dw     Rows           ;??? ??????? ???
n        dw     Columns        ;??? ??????? ????

mas      db     arSize dup(?)  ;????
_mas     db     arSize dup(?)  ;????????? ???? ??? ??????????

asDigit  db     '000 ', '$'    ;? ??? ???? ??? ?????????? ??
                               ;??? ???? ?? ??
HexTabl  db     '0123456789abcdef'

asCR_LF  db     0dh, 0ah,         '$'  ;"????? ????"
asTitle0 db     'Input matrix',   '$'  ;
asTitle1 db     'Current matrix', '$'  ;
asTitle2 db     'Result matrix',  '$'  ;
asPrompt db      'a[   ,   ]=',   '$'  ;

kbMaxLen equ     3+1                   ;???? ????? ? ?????????? Fn 0ah
kbInput  db      kbMaxLen, 0, kbMaxLen dup(0)

temp     db     0                      ; ????????? ????????

.code
PUBLIC TRAN
TRAN proc near
push ebp
mov ebp, esp


; ?? ???
; ax - ??
; bx - ???? ??????
; cx - ???????? ????? ????
; si - ???? ????
SPrintf PROC
        pusha

        ;???? ?????? ????
        push    cx
@@ClearStr:
        mov     BYTE PTR [si]  , ' '
        inc     si
        loop    @@ClearStr
        pop     cx
        dec     si
@@Next:
        xor     dx, dx
        div     bx
        push    ax
        push    bx
    xor ax, ax
        mov al, dl
        mov     bx, OFFSET HexTabl
        xlat
        mov     [si], al
        pop     bx
        pop     ax

        dec     si
        and     ax, ax
        jz      @@Finish
        loop    @@Next
@@Finish:
        popa
        ret
SPrintf ENDP

; ?? ???
;bx    - ???? ??????
;ds:dx - ????? ?? ???? ???
;        0 ???? - ????? ???? (0..255)
;        1 ???? - ???? ????
;ds:di - ????? ?? ????, ?? ??? ?????? ?????
; ?? ????
;CY    - ?? ???????? - ???? ?????????? ???? ? ??
SScanf  PROC

        pusha
        mov     si, dx
        mov     cx, 0
        mov     cl, [si]
        mov     ax, 0
        mov     [di], al
        inc     si
@@Loop:
        mov     ax, 0
        mov     al, [di]
        mul     bx
        mov     [di], al

        mov     al, [si]
        inc     si
        cmp     al, '0'
        jb      @@Error
        cmp     al, '9'
        ja      @@NoDigit
        sub     al, '0'
        jmp     @@Conv
@@NoDigit:
        sub     al, 'a'
        add     al, 10
@@Conv:
        add     temp, al
        loop    @@Loop
@@Ok:
        popa
        clc
        ret
@@Error:
        popa
        stc
        ret
SScanf  ENDP

; ?? ???
;m     - ??????? ???
;n     - ??????? ????
;ds:dx - ???? ??????
ShowMatrix PROC FAR
        pusha
        mov     si, 0  ; ????
        mov     di, 0  ; ?????
        mov     cx, dx

@@ShowRow:
        mov     dx, 0
        mov     ax, n
        mul     si
        mov     bx, ax
        add     bx, cx

        mov     ah, 0
        mov     al, [bx+di]

        push    si
        push    cx
        mov     bx, 10
        mov     cx, 3
        mov     si, OFFSET asDigit
        call    SPrintf
        pop     cx
        pop     si

        mov     ah, 09h
        mov     dx, OFFSET asDigit
        int     21h

        inc     di

        cmp     di, n
        jb      @@ShowRow

        mov     dx, OFFSET asCR_LF
        mov     ah, 09h
        int     21h

        mov     di, 0

        inc     si

        cmp     si, m
        jb      @@ShowRow

        popa
        ret
ShowMatrix ENDP

; ?? ???
;ds:dx - ???? ??????
InputMatrix PROC
        pusha

        ;??? ?? ?? ??????? ????? ??????
        push    dx
        mov     ah, 09h
        mov     dx, OFFSET asTitle0
        int     21h

        mov     ah, 09h
        mov     dx, OFFSET asCR_LF
        int     21h
        pop     dx

        mov     si, 0  ; ????
        mov     di, 0  ; ?????
        mov     cx, dx
@@InpRow:
        ;??? ?? ?? ??????? 'a[  1,  1]='
        push     si
        mov      ax, si
        inc      ax
        mov      bx, Metric
        mov      cx, 3
        mov      si, OFFSET asPrompt+2
        call     SPrintf
        pop      si

        push     si
        mov      ax, di
        inc      ax
        mov      bx, Metric
        mov      cx, 3
        mov      si, OFFSET asPrompt+6
        call     SPrintf
        pop      si

        push    dx
        mov     dx, OFFSET asPrompt
        mov     ah, 09h
        int     21h

        ;???? ????
        mov     ah, 0ah
        mov     dx, OFFSET kbInput
        int     21h

        ;?????????? ???? ? ?? (????? - ? ???????? temp)
        push    di
        mov     dx, OFFSET kbInput+1
        mov     di, OFFSET temp
        mov     bx, Metric
        call    SScanf
        pop     di
        pop     dx
        jc      @@InpRow  ; ?? ???? ?????????? - ??????? ????

        ;??????? ??????? ?? ? ?????
        push    dx
        xor     dx, dx
        mov     ax, n
        mul     si
        pop     dx
        mov     bx, dx
        add     bx, ax
        mov     al, temp
        mov     [bx+di], al

        ;?? ??? - ???? ? ????? ????
        push    dx
        mov     dx, OFFSET asCR_LF
        mov     ah, 09h
        int     21h
        pop     dx

        inc     di

        cmp     di, n
        jb      @@InpRow

        mov     di, 0

        inc     si

        cmp     si, m
        jb      @@InpRow

        popa
        ret
InputMatrix ENDP

Main    PROC    FAR
        mov     dx, @data
        mov     ds, dx

        mov     dx, OFFSET mas
        call    InputMatrix

        mov     ah, 09h
        mov     dx, OFFSET asTitle1
        int     21h

        mov     ah, 09h
        mov     dx, OFFSET asCR_LF
        int     21h

        mov     dx, OFFSET mas
        call    ShowMatrix

        ;????????? ?????? - ????? ?? ?????????? ??????
        xor     ecx, ecx
        mov     cx, m
        xor     si, si
m1:
        push    cx
        mov     cx, n
        xor     di, di
m2:
        mov     ax, n
        mul     si
        add     ax, di
        mov     bx, ax
        mov     al, mas[bx]
        mov     temp, al
        mov     ax, m
        mul     di
        add     ax, si
        mov     bx, ax
        mov     al, temp
        mov     _mas[bx], al
        inc     di
        loop    m2
        inc     si
        pop     cx
        loop    m1

        mov     ax, m
        xchg    ax, n
        mov     m, ax

        ;???????? ????? ?? ????????? ?????? _mas
        ;? ?????? mas
        mov     cx, arSize
        cld
        push    ds
        pop     es
        mov     si, OFFSET _mas
        mov     di, OFFSET mas
        rep     movsb    ; ???????? cx ???? ?? ds:si ? es:di

        ;??? ????? ?? ??
        mov     ah, 09h
        mov     dx, OFFSET asTitle2
        int     21h

        mov     ah, 09h
        mov     dx, OFFSET asCR_LF
        int     21h

        mov     dx, OFFSET mas
        call    ShowMatrix

        mov     ax, 4c00h
        int     21h
        
        
Main    ENDP
      
END     Main


 pop ebp
 ret 12 
       
       TRAN endp
       end
Illtry вне форума Ответить с цитированием
Старый 30.11.2019, 18:31   #2
Desc
Участник клуба
 
Аватар для Desc
 
Регистрация: 21.11.2007
Сообщений: 1,063
По умолчанию

>>Ассемблер в Delphi<<
>>Программирование АССЕМБЛЕРОМ в Delphi<<
I am not a wizard, I am just learning.
Desc вне форума Ответить с цитированием
Старый 01.12.2019, 04:16   #3
R71MT
Участник клуба
 
Аватар для R71MT
 
Регистрация: 16.06.2011
Сообщений: 1,428
По умолчанию

Цитата:
Сообщение от Illtry Посмотреть сообщение
процедура выполняет транспонирование матрицы
не знаю, что подразумевается под "транспонированием",
но код явно вышел из-под пера какого-то про(кило)граммера - слишком массивная процедура для такой задачи.

а чтобы поженить асм с дельфи, делай вставки - по ссылкам выше есть примеры..
Нашедшего выход - затаптывают первым..
R71MT вне форума Ответить с цитированием
Старый 01.12.2019, 13:48   #4
Mikl___
Участник клуба
 
Регистрация: 11.01.2010
Сообщений: 1,162
По умолчанию

Цитата:
Сообщение от R71MT Посмотреть сообщение
не знаю, что подразумевается под "транспонированием"
Тимур,
транспонировать матрицу это значит повернуть ее на 90 градусов
Код:
|1 2 3|     |1 4 7|
|4 5 6| --> |2 5 6|
|7 8 9|     |3 6 9|
Mikl___ вне форума Ответить с цитированием
Старый 01.12.2019, 18:05   #5
Illtry
Пользователь
 
Регистрация: 09.02.2018
Сообщений: 22
По умолчанию

Цитата:
Сообщение от R71MT Посмотреть сообщение
но код явно вышел из-под пера какого-то про(кило)граммера - слишком массивная процедура для такой задачи.
Как можно это улучшить?
Illtry вне форума Ответить с цитированием
Старый 01.12.2019, 18:07   #6
Illtry
Пользователь
 
Регистрация: 09.02.2018
Сообщений: 22
По умолчанию

Цитата:
Сообщение от R71MT Посмотреть сообщение
а чтобы поженить асм с дельфи, делай вставки
Нужно не вставками, а через отдельный obj ассемблерный файл
Illtry вне форума Ответить с цитированием
Старый 01.12.2019, 21:35   #7
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 4,536
По умолчанию

Цитата:
Сообщение от Mikl___ Посмотреть сообщение
транспонировать матрицу это значит повернуть ее на 90 градусов
Да? А может быть, повернуть зеркально относительно главной диагонали? И приведенный пример - тому иллюстрация.
Повернул на 90гр. Получил БСК.
Код:
    1 2 3       7 4 1
    4 5 6  ->   8 5 2
    7 8 9       9 6 3
* БСК - это не bsk.by, это - бред сивой кобылы

Последний раз редактировалось digitalis; 01.12.2019 в 21:41.
digitalis вне форума Ответить с цитированием
Старый 01.12.2019, 22:26   #8
Desc
Участник клуба
 
Аватар для Desc
 
Регистрация: 21.11.2007
Сообщений: 1,063
По умолчанию

>>Транспонирование матрицы<<
>>Действия с матрицами<<
I am not a wizard, I am just learning.
Desc вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ассемблер в Delphi NetSpace Общие вопросы Delphi 35 27.01.2015 17:47
ассемблер в Delphi, адрес переменной Obert Помощь студентам 7 12.06.2011 16:18
Ассемблер в Delphi Вячеславик Помощь студентам 3 11.05.2010 14:35
Ассемблер в Delphi Roof Помощь студентам 7 21.12.2008 00:21