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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 19.05.2017, 17:56   #1
flu3xz
Пользователь
 
Регистрация: 19.05.2017
Сообщений: 26
По умолчанию Перевод из FASM в I8086

Доброго времени суток, нужно перевести код программы из TASM в программу, которая выполнялась бы в эмуляторе i8086.(Данная программа в словах с четным номером должна изменять порядок букв на обратный.)

Код:
.686             ; директива визначення типу мікропроцесора
.model flat,stdcall  ; завдання лінійної моделі пам’яті
                     ; та угоди ОС Windows
option casemap:none  ; відмінність малих та великих літер
include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
;include \masm32\include\fpu.inc
include \masm32\include\user32.inc        ; для MessageBox
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
BSIZE equ 30 
.data
mas1        db  'abc wer tyd oop yhf tdd kjs llj'
        db  0dh, 0ah
;mas2       db  31 dup(0)
cWritten    dd  ?
stdout      dd  ?
.code
_Start:
    invoke  GetStdHandle, STD_OUTPUT_HANDLE
    mov stdout, eax
    invoke  WriteConsoleA, stdout, ADDR mas1, sizeof mas1+2, ADDR cWritten, 0
 
    cld             ; напрям- вгору
    mov ecx, sizeof mas1    ;* длина строки с массивом
    mov dl, 01010101b       ;* чёт/нечет
    mov bl, ' '         ;* пробел - разделитель элементов массива
    mov edi, offset mas1    ; адреса 1-го масиву
@@scan:
    test    ecx, ecx
    mov al, bl          ; поместить пробел в al
    jz  @@end_scan      ; выйти, если достигнут конец строки (массива)
    mov esi, edi        ; сохранить в esi указатель на начало текущего слова
    repne   scasb           ; найти следующий пробел (или конец массива)
    je  @F          ; если пробел найден - перепрыгнуть
    inc edi         ; подправить edi для правильного вычисления длины слова (если достигнут конец строки)
@@:
    ror dl, 1           ; повернуть "барабан" в dl, соcтоящий из единичных и нулевых бит на одну позицию
    jc  @@scan          ; если перенесён единичный бит, то слово нечетное - продолжить сканирование
    push    ecx
    push    edi
    mov ecx, edi
    sub ecx, esi        ; ecx=количеству букв в слове плюс пробел
    dec edi         ; [edi]=пробел (или символ за концом строки)
    dec ecx         ; ecx=количеству букв в слове
    dec edi         ; [edi]=последний символ слова
    shr ecx, 1          ; ecx=количеству необходимых обменов букв
    jz  @@pop
@@:
    mov al, [esi]
    xchg    al, [edi]
    mov [esi], al
    dec edi
    inc esi
    dec ecx
    jnz @B
@@pop:
    pop edi
    pop ecx
    jmp @@scan
@@end_scan:
 
    invoke  WriteConsoleA, stdout, ADDR mas1, sizeof mas1+2, ADDR cWritten, 0
 
    push    1800h
    call    Sleep                  ; API-функция задержки изображения
 
    invoke  ExitProcess, 0
    end _Start

Последний раз редактировалось flu3xz; 19.05.2017 в 18:54.
flu3xz вне форума Ответить с цитированием
Старый 19.05.2017, 18:18   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,706
По умолчанию

а фасм то где?
p51x вне форума Ответить с цитированием
Старый 19.05.2017, 18:50   #3
flu3xz
Пользователь
 
Регистрация: 19.05.2017
Сообщений: 26
По умолчанию

.model flat
разве не идет как у tasm? да и последующее написание

Последний раз редактировалось flu3xz; 19.05.2017 в 18:54.
flu3xz вне форума Ответить с цитированием
Старый 19.05.2017, 18:51   #4
flu3xz
Пользователь
 
Регистрация: 19.05.2017
Сообщений: 26
По умолчанию

Цитата:
Сообщение от flu3xz Посмотреть сообщение
invoke WriteConsoleA, stdout, ADDR mas1, sizeof mas1+2, ADDR cWritten, 0
такое написание я в tasm видел.

Последний раз редактировалось flu3xz; 19.05.2017 в 18:53.
flu3xz вне форума Ответить с цитированием
Старый 19.05.2017, 18:55   #5
flu3xz
Пользователь
 
Регистрация: 19.05.2017
Сообщений: 26
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
а фасм то где?
извиняюсь это tasm не так написал.
flu3xz вне форума Ответить с цитированием
Старый 19.05.2017, 19:36   #6
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

А разве в тасаме есть invoke ?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .
Pavia вне форума Ответить с цитированием
Старый 19.05.2017, 20:21   #7
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,706
По умолчанию

Код:
include \masm32\include\windows.inc
ни на что не наводит?..
p51x вне форума Ответить с цитированием
Старый 19.05.2017, 23:18   #8
flu3xz
Пользователь
 
Регистрация: 19.05.2017
Сообщений: 26
По умолчанию

я учусь работать только в эмуляторе 8086, и при виде таких символов я понятия не имею что с этим делать, собственно поэтому и обратился сюда
flu3xz вне форума Ответить с цитированием
Старый 20.05.2017, 10:26   #9
7in
(aka Jin X) !RTFM!
Форумчанин
 
Аватар для 7in
 
Регистрация: 14.12.2014
Сообщений: 295
По умолчанию

Код:
.model small  ; завдання лінійної моделі пам’яті
                     ; та угоди ОС Windows
.stack 100h
.data
mas1        db  'abc wer tyd oop yhf tdd kjs llj'
Lmas1=$-mas1
        db  0dh, 0ah, '$'
;mas2       db  31 dup(0)
cWritten    dd  ?
stdout      dd  ?

.code
_Start:

    mov ax,@data
    mov ds,ax
    mov es,ax
    
    mov ah,9
    lea dx,mas1
    int 21h        ; вывод
 
    cld             ; напрям- вгору
    mov cx, Lmas1    ;* длина строки с массивом
    mov dl, 01010101b       ;* чёт/нечет
    mov bl, ' '         ;* пробел - разделитель элементов массива
    mov di, offset mas1    ; адреса 1-го масиву
@@scan:
    test    cx, cx
    mov al, bl          ; поместить пробел в al
    jz  @@end_scan      ; выйти, если достигнут конец строки (массива)
    mov si, di        ; сохранить в esi указатель на начало текущего слова
    repne   scasb           ; найти следующий пробел (или конец массива)
    je  @@1          ; если пробел найден - перепрыгнуть
    inc di         ; подправить edi для правильного вычисления длины слова (если достигнут конец строки)
@@1:
    ror dl, 1           ; повернуть "барабан" в dl, соcтоящий из единичных и нулевых бит на одну позицию
    jc  @@scan          ; если перенесён единичный бит, то слово нечетное - продолжить сканирование
    push    cx
    push    di
    mov cx, di
    sub cx, si        ; ecx=количеству букв в слове плюс пробел
    dec di         ; [edi]=пробел (или символ за концом строки)
    dec cx         ; ecx=количеству букв в слове
    dec di         ; [edi]=последний символ слова
    shr cx, 1          ; ecx=количеству необходимых обменов букв
    jz  @@pop
@@2:
    mov al, [si]
    xchg    al, [di]
    mov [si], al
    dec di
    inc si
    dec cx
    jnz @@2
@@pop:
    pop di
    pop cx
    jmp @@scan
@@end_scan:
 
    mov ah,9
    lea dx,mas1
    int 21h        ; вывод

    mov ax,8600h
    mov cx,100
    xor dx,dx
    int 15h         ; пауза
 
    mov ax,4C00h
    int 21h         ; выход

end _Start
Комменты самостоятельно правь уже.
p.s. По сути, поменял все eax,ecx,esi... на ax,cx,si...
Ну и переписал заголовки, инициализацию ds,es, вывод, паузу, выход... всё работает
Делаю лабы на Asm/Delphi/C++/Python/VBA(Excel): asmlabs.ru

Последний раз редактировалось 7in; 20.05.2017 в 10:28.
7in вне форума Ответить с цитированием
Старый 20.05.2017, 18:40   #10
flu3xz
Пользователь
 
Регистрация: 19.05.2017
Сообщений: 26
По умолчанию

огромное спасибо!
flu3xz вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Перевод числа в текстовую строку, исправить код (FASM) Tanchik0611 Помощь студентам 2 21.10.2012 16:29
Чем отличаеться fasm от fasm editor&? TotKtoNado Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 5 07.11.2011 17:00
выdод данных i8086 Skyer123 Помощь студентам 1 17.06.2011 21:58
i8086 : массив smoke-by Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 2 13.12.2010 00:28