Форум программистов  
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler
Регистрация

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

Ответ
 
Опции темы
Старый 19.05.2017, 18:56   #1
flu3xz
Пользователь
 
Регистрация: 19.05.2017
Сообщений: 26
Репутация: 10
По умолчанию Перевод из 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 в 19:54.
flu3xz вне форума   Ответить с цитированием
Старый 19.05.2017, 19:18   #2
p51x
Профессионал
 
Регистрация: 15.02.2010
Сообщений: 9,955
Репутация: 1573

icq: 216409213
По умолчанию

а фасм то где?
__________________
Запомните раз и навсегда: помочь != "решите за меня"!
p51x на форуме   Ответить с цитированием
Старый 19.05.2017, 19:50   #3
flu3xz
Пользователь
 
Регистрация: 19.05.2017
Сообщений: 26
Репутация: 10
По умолчанию

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

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

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

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

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

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

icq: 216409213
По умолчанию

Код:

include \masm32\include\windows.inc

ни на что не наводит?..
__________________
Запомните раз и навсегда: помочь != "решите за меня"!
p51x на форуме   Ответить с цитированием
Старый 20.05.2017, 00:18   #8
flu3xz
Пользователь
 
Регистрация: 19.05.2017
Сообщений: 26
Репутация: 10
По умолчанию

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

Код:

.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: asmlabs.ru
Tell me would you kill to save a life? Tell me would you kill to prove you're right?
Crash, crash, burn, let it all burn, this hurricane's chasing us all underground...

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

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



Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

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




03:12.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.

купить трафик


как улучшить посещаемость, а также решения по монетизации сайтов, видео и приложений

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru