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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 22.06.2015, 15:15   #1
nikola_sp
Новичок
Джуниор
 
Регистрация: 22.06.2015
Сообщений: 3
По умолчанию помогите перетащить из FASM в TASM

Есть пример в fasm, а мне нужно в tasm пожалуйста помогите
Код:
;FASM
;z = (1005D+B)/C*D
    org 100h
    call    getvar
    jc  gtfo
    mov [B], eax
    call    getvar
    jc  gtfo
    mov [_C], eax
    call    getvar
    jc  gtfo
    mov [D], eax
    fild    word [@1005]
    fimul   dword [D]
    fiadd   dword [B]
    fidiv   dword [_C]
    fimul   dword [D]
    
    fst st1
    fstcw   [FPUCW]         ;store FPU control word
    or  word [FPUCW], 0C00h;set rounding mode: truncate
    fldcw   [FPUCW]     ;load FPU control word
    frndint         ; округляем
    fist    dword [Z]   ; сохраняем целую часть
    fsubp   st1, st0    ; получаем дробную часть
    fimul   dword [ths] ; *1000 - 3 знака после запятой
    fistp   dword [Z_]  ; сохраняем дробную часть
    mov dx, res
    mov ah, 9
    int 21h
    mov eax,[Z]
    call    _cputl
    mov al,'.'
    int 29h
    mov eax,[Z_]
    mov ecx,3
    call    _cputfc
    xor ax,ax
    int 16h
gtfo:   ret
_cputl:
    mov ebx, eax
    neg ebx
    cmovs   ebx, eax
    jle @F
    mov al, '-'
    int 29h
@@: mov eax, ebx
 
_cputul:
    xor ecx, ecx
    mov ebx, 0Ah
    xor esi, esi
    xor edi, edi
@@: xor edx, edx
    inc ecx
    idiv    ebx
    shld    edi, esi, 4
    shl esi, 4
    or  si, dx
    test    eax, eax
    jnz @B
    mov edx, esi
@@: mov al, dl
    and al, 0fh
    or  al, 30h
    shrd    edx, edi, 4
    shr edi, 4
    int 29h
    loop    @B
    ret
_cputfc:
    mov ebx, ecx
    xor esi, esi
    xor edi, edi
@@: xor edx, edx
    idiv    dword [ten]
    shld    edi, esi, 4
    shl esi, 4
    or  si, dx
    loop    @B
    mov ecx, ebx
    mov edx, esi
@@: mov al, dl
    and al, 0fh
    or  al, 30h
    shrd    edx, edi, 4
    shr edi, 4
    int 29h
    loop    @B
    ret
 
_cgetl:     pushad
        xor edx, edx
        mov ebp, edx
        mov ebx, ecx
@l:
        call    getch
        or  al,al
        jz  @l
        cmp al, 1Bh     
        jz  cancel
        cmp al, 0Dh         
        jz  done
        cmp al, '-'
        jz  sign
        cmp al, 08h         
        jnz @F
        call    rubout
        jmp @l
@@:     cmp al, 30h
        jb  @l
        cmp al, 39h
        ja  @l
        movzx   eax,al          
            lea edx,[edx*4+edx]     
            lea edx,[edx*2+eax-48]  
            int 29h
            loop    @l
; выход
done:       mov eax, edx        ;
        or  ebp, ebp
        jz  @F
        neg eax
@@:     clc
        jmp ex
cancel:     xor eax, eax
        dec eax             
        stc       
ex:     mov [ss:esp+1Ch], eax
        popad
        ret              ;
sign:       cmp ebx, ecx    
        ja  @l              
        inc ebp
            
        int 29h
        jmp @l      
 
getch:      xor     ax, ax
        int 16h
        ret
 
rubout:     cmp ebx, ecx    
        ja  @F              
        test    ebp,ebp     
        jz  @e              
        dec ebp             
        jmp @bs             
@@:     mov eax, edx
        xor edx, edx
        idiv    dword ptr ten   
        mov edx,eax
        inc ecx
@bs:        call    bksp
@e:     ret
 
bksp:       mov ax, 2008h
        int 29h
        xchg    ah,al
        int 29h
        xchg    ah,al
        int 29h
        ret
getvar: inc byte [msgvar]
    mov dx, msg
    mov ah, 9
    int 21h
    mov cx, 5
    call    _cgetl
    ret
@1005:  dw  1005
ten:    dd  10
ths:    dd  1000
FPUCW:  dw  ?
B:  dd  ?
_C: dd  ?
D:  dd  ?
Z:  dd  ?
Z_: dd  ?
msg:    db  0Dh,0Ah,'Enter A:$'
msgvar  =   $-3
res:    db  0Dh,0Ah,'Z=$'

Последний раз редактировалось Stilet; 22.06.2015 в 16:24.
nikola_sp вне форума Ответить с цитированием
Старый 22.06.2015, 21:58   #2
R71MT
Участник клуба
 
Аватар для R71MT
 
Регистрация: 16.06.2011
Сообщений: 1,428
По умолчанию

..во-первых - чем тебе FASM насолил? TASM уже заброшен и не поддерживается разработчиками.

..во-вторых - признаком TASM/MASM'а являются директивы "jumps/locals/offset/ptr". Если копируеш в регистр значение, то "offset" не указываеш; если-же регистр указывает на адрес в памяти, то эта директива нужна (она и переводится дословно как: "смещение"). Там, где указаны размеры (byte/word/dword) везде добавляй приставку "PTR".

Ниже, участок из твоего кода на FASM, переделанный на TASM. Остальное измениш сам:

Код:
;;; FASM =============================|
;;; ***********************************
msg  db  0Dh,0Ah,'Enter A: $'

getvar:
  inc byte [msgvar]
  mov dx, msg
  mov ah,9
  int 21h
  mov cx,5
  call  _cgetl
ret


;;; NASM =============================|
;;; ***********************************
.386
.model small

getvar:
  inc byte ptr [msgvar]
  mov dx, offset msg
  mov ah,9
  int 21h
  mov cx,5
  call  _cgetl
ret

msg  db  0Dh,0Ah,'Enter A: $'
Нашедшего выход - затаптывают первым..
R71MT вне форума Ответить с цитированием
Старый 23.06.2015, 09:29   #3
nikola_sp
Новичок
Джуниор
 
Регистрация: 22.06.2015
Сообщений: 3
По умолчанию

Цитата:
Сообщение от R71MT Посмотреть сообщение
..во-первых - чем тебе FASM насолил? TASM уже заброшен и не поддерживается разработчиками.

..во-вторых - признаком TASM/MASM'а являются директивы "jumps/locals/offset/ptr". Если копируеш в регистр значение, то "offset" не указываеш; если-же регистр указывает на адрес в памяти, то эта директива нужна (она и переводится дословно как: "смещение"). Там, где указаны размеры (byte/word/dword) везде добавляй приставку "PTR".

Ниже, участок из твоего кода на FASM, переделанный на TASM. Остальное измениш сам:
Мне нужен Tasm это задание на зачет, помогите пожалуйста, я знаю, что это не красиво и не правильно но у меня завтра зачет, а надо хоть попробовать как она работает, помогите очень надо.
nikola_sp вне форума Ответить с цитированием
Старый 23.06.2015, 14:10   #4
R71MT
Участник клуба
 
Аватар для R71MT
 
Регистрация: 16.06.2011
Сообщений: 1,428
По умолчанию

Я никогда не писал на TASM'e, и нет даже его компилятора, чтоб проверить получившийся код.
Сам пробуй - компилятор должен указать на ошибки...

Код:
;TASM
;z = (1005D+B)/C*D

.386
.model small
org 100h
locals
jumps

.data
  @1005   dw  1005
    ten   dd  10
    ths   dd  1000
  FPUCW   dw  ?
      B   dd  ?
     _C   dd  ?
      D   dd  ?
      Z   dd  ?
     Z_   dd  ?
    msg   db  0Dh,0Ah,'Enter A:$'
  msgva   =   $-3
    res   db  0Dh,0Ah,'Z=$'

.code
start:
   call    getvar
   jc      gtfo
   mov     offset [B],eax
   call    getvar
   jc      gtfo
   mov     offset [_C],eax
   call    getvar
   jc      gtfo
   mov     offset [D], eax
   fild    word ptr [@1005]
   fimul   dword ptr [D]
   fiadd   dword ptr [B]
   fidiv   dword ptr [_C]
   fimul   dword ptr [D]
    
   fst     st1
   fstcw   offset [FPUCW]             ;store FPU control word
   or      word ptr [FPUCW],0C00h     ;set rounding mode: truncate
   fldcw   offset [FPUCW]             ;load FPU control word
   frndint                            ; округляем
   fist    dword ptr [Z]              ; сохраняем целую часть
   fsubp   st1, st0                   ; получаем дробную часть
   fimul   dword ptr [ths]            ; *1000 - 3 знака после запятой
   fistp   dword ptr [Z_]             ; сохраняем дробную часть
   mov     dx,offset res
   mov     ah, 9
   int     21h
   mov     eax, [Z]
   call    _cputl
   mov     al, '.'
   int     29h
   mov     eax, [Z_]
   mov     ecx, 3
   call    _cputfc
   xor     ax, ax
   int     16h
gtfo:      ret
_cputl:
   mov     ebx, eax
   neg     ebx
   cmovs   ebx, eax
   jle     @F
   mov     al, '-'
   int     29h
@@:
   mov     eax, ebx
_cputul:
   xor     ecx, ecx
   mov     ebx, 0Ah
   xor     esi, esi
   xor     edi, edi
@@: 
   xor     edx, edx
   inc     ecx
   idiv    ebx
   shld    edi, esi, 4
   shl     esi, 4
   or      si, dx
   test    eax, eax
   jnz @B
   mov     edx, esi
@@:
   mov     al, dl
   and     al, 0fh
   or      al, 30h
   shrd    edx, edi, 4
   shr     edi, 4
   int     29h
   loop    @B
   ret
_cputfc:
   mov     ebx, ecx
   xor     esi, esi
   xor     edi, edi
@@:
   xor     edx, edx
   idiv    dword ptr [ten]
   shld    edi, esi, 4
   shl     esi, 4
   or      si, dx
   loop    @B
   mov     ecx, ebx
   mov     edx, esi
@@:
   mov     al, dl
   and     al, 0fh
   or      al, 30h
   shrd    edx, edi, 4
   shr     edi, 4
   int     29h
   loop    @B
   ret
_cgetl:
   pushad
   xor     edx, edx
   mov     ebp, edx
   mov     ebx, ecx
@l:
   call    getch
   or      al, al
   jz      @l
   cmp     al, 1Bh     
   jz      cancel
   cmp     al, 0Dh         
   jz      done
   cmp     al, '-'
   jz      sign
   cmp     al, 08h         
   jnz     @F
   call    rubout
   jmp     @l
@@:
   cmp     al, 30h
   jb      @l
   cmp     al, 39h
   ja      @l
   movzx   eax, al          
   lea     edx, [edx*4+edx]     
   lea     edx, [edx*2+eax-48]  
   int     29h
   loop    @l

;;;--------------------------- выход
done:
   mov     eax, edx        
   or      ebp, ebp
   jz      @F
   neg     eax
@@:
   clc
   jmp     ex
cancel:
   xor     eax, eax
   dec     eax             
   stc       
ex:
   mov     offset [ss:esp+1Ch], eax
   popad
   ret     
sign:
   cmp     ebx, ecx    
   ja      @l              
   inc     ebp
   int     29h
   jmp     @l      
getch:
   xor     ax, ax
   int     16h
   ret
rubout:
   cmp     ebx, ecx    
   ja      @F              
   test    ebp, ebp     
   jz      @e              
   dec     ebp             
   jmp     @bs             
@@:
   mov     eax, edx
   xor     edx, edx
   idiv    dword ptr ten   
   mov     edx, eax
   inc     ecx
@bs:
   call    bksp
@e:        ret
bksp:
   mov     ax, 2008h
   int     29h
   xchg    ah, al
   int     29h
   xchg    ah, al
   int     29h
   ret
getvar:
   inc     byte ptr [msgvar]
   mov     dx, offset msg
   mov     ah, 9
   int     21h
   mov     cx, 5
   call    _cgetl
   ret

ends
end start
Нашедшего выход - затаптывают первым..
R71MT вне форума Ответить с цитированием
Старый 23.06.2015, 22:45   #5
nikola_sp
Новичок
Джуниор
 
Регистрация: 22.06.2015
Сообщений: 3
По умолчанию

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


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Эллипс в DOS (masm, tasm, fasm) Mikl___ Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 14 13.12.2014 09:06
tasm-->fasm прошу помочь переделать!!! absolut2014 Фриланс 1 23.01.2014 05:56
tasm-->fasm прошу помочь переделать!!! absolut2014 Помощь студентам 0 21.01.2014 08:18
tasm>>fasm better Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 11 09.02.2009 19:34
Обьясните различия между - FASM, WASM, VASM, MASM, TASM Amancha Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 9 17.01.2009 15:38