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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 26.11.2010, 13:41   #1
Marinkin
 
Регистрация: 25.09.2010
Сообщений: 6
По умолчанию Assembler. Легко для знающего...

Я полный ноль в асме.. Задачки несложные.. Помогите написать программы...
1. Вычислить значение у. Значения переменных ввести с клавиатуры. Результат вывести
на экран.
(a-b)/c = y

2. Обменять местами две половины операнда. Инвертировать бит, номер которого вводится с клавиатуры. Для числа 4e4a
Marinkin вне форума Ответить с цитированием
Старый 26.11.2010, 16:09   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Насчет ввода с клавы я пас, но вот вычисление может выглядеть так:
Код:
mov eax,[a]
sub eax,[b]
xor edx,edx
mov ebx,[c]
div ebx
mov [y],eax
Если не ошибаюсь, пишу по памяти

Цитата:
Обменять местами две половины операнда
Код:
mov ax,4e4ah
xchg al,ah
Насчет инвертирования точно не помню
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 12.12.2010, 00:39   #3
Marinkin
 
Регистрация: 25.09.2010
Сообщений: 6
По умолчанию

Спасибо огромное! Инвертирование я как-нибудь самостоятельно
Marinkin вне форума Ответить с цитированием
Старый 15.01.2011, 12:59   #4
Adyvan
Пользователь
 
Регистрация: 15.01.2011
Сообщений: 24
По умолчанию

Цитата:
Сообщение от Marinkin Посмотреть сообщение
Я полный ноль в асме.. Задачки несложные.. Помогите написать программы...
1. Вычислить значение у. Значения переменных ввести с клавиатуры. Результат вывести
на экран.
(a-b)/c = y

2. Обменять местами две половины операнда. Инвертировать бит, номер которого вводится с клавиатуры. Для числа 4e4a

Код:
text segment
assume cs:text,ds:data
stk segment stack
    db 256 dup(0)
stf ends
data segment
;////////////////////
rax dw 0
rbx dw 0
rcx dw 0
rdx dw 0
rsi dw 0
rdi dw 0
endl db 0ah,0dh
coutN db 5 dup(0) 
;//////////////////// 
data ends
begin:
.386      
       mov ax,data
       mov ds, ax
       ;cout  вывод:  AX-число(СЛОВО) выводит на моник (DI,CX,AX,DX) + массив: coutn[1..5]  
       ;cin  ввод: в AX заносит число(СЛОВО)   (DI,CX,BX) (+ переход на новую строку)
       ;во всех предыдущих процедурах предусмотрено возвращение значений регистров (call loadr)
       ;del  делит: AX(слово)/CX(слово) = значению на экране  (CX < 32768)(DI=количеству знаков после запетой)
        mov AX,0aaaah
        mov BX,2
        xor DX,DX
        mov CX,16
        
obs1:   mul BX
        dec CX
        jnz obs1 
        
;end        
       mov ah,4ch
       mov al,0
       int 21h
;////////////////////;////////////////////
del proc ;AX(слово)/CX(слово) = значению на экране  (CX < 32768)(DI=количеству знаков после запетой)
      xor DX,DX
      div CX  
      call cout   ;(DI,CX,AX,DX)
       mov ah,02h
       mov dl,','
       int 21h
      call loadr
drob: mov AX,DX
      xor DX,DX
      mov BX,10
      mul BX
      xor DX,DX
      div CX
      add al,'0'
      call saver
       mov dl,al
       mov ah,02h
       int 21h
      call loadr
      dec DI
      cmp DI,0
      je exwe
      jmp endiv
exwe: mov CX,0     
endiv: jnz drob             
 ret
del endp
cout proc ;AX-число(СЛОВО) выводит на моник (DI,CX,AX,DX) + массив: coutn[1..5]
     call saver   
     mov DI,0 
     mov CX,10
writ:
     cmp AX,0
     je exw
     xor DX,DX
     div CX
     add dl,'0'
     mov coutN[DI],dl
     inc DI
     jmp lip
exw: mov CX,0
lip: jnz writ

wri: dec DI
     mov ah,02h
     mov dl,coutn[DI]
     int 21h
     mov CX,DI
     jnz wri
 ret
cout endp
       
cin proc ; в AX заносит число(СЛОВО) (DI,CX,BX) (+ переход на новую строку)
    call saver
       xor DI,DI 
inpt_0: mov ah,08h
       int 21h
       cmp al,'9'
       ja inpt_0
       cmp al,'0'
       jb inpt_0
       mov ah,02h
       mov dl,al
       int 21h
       sub al,'0'
       xor ah,ah
       mov CX,AX
       mov AX,DI
       mov BX,10
       mul BX
       add AX,CX
       mov DI,AX
inpt:  mov ah,08h
       int 21h
       cmp al,13
       je done
       cmp al,'9'
       ja inpt
       cmp al,'0'
       jb inpt
       mov ah,02h
       mov dl,al
       int 21h
       sub al,'0'
       xor ah,ah
       mov CX,AX
       mov AX,DI
       mov BX,10
       mul BX
       add AX,CX
       mov DI,AX
       jmp inpt
done:  ;///////////////////////     переход на новую строку
       mov ah,40h
       mov CX,1
       mov BX,1
       mov DX,offset endl 
       int 21h
       ;///////////////////////
       mov AX,DI      
   ret
cin endp
saver proc
      mov rax,AX
      mov rbx,BX
      mov rcx,CX
      mov rdx,DX
      mov rsi,SI
      mov rdi,DI
 ret
saver endp
loadr proc
      mov AX,rax
      mov BX,rbx
      mov CX,rcx
      mov DX,rdx
      mov SI,rsi
      mov DI,rdi
 ret
loadr endp 
delr proc
     xor AX,AX
     xor BX,BX
     xor CX,CX
     xor DX,DX
     xor SI,SI
     xor DI,DI    
 ret
delr endp
;////////////////////         
end begin 
text ends
Сдесь описаны процедура ввода и процедура вывода (тип dw) и деление del она делит число на число и выводит в десетичной дроби!!

Последний раз редактировалось Stilet; 15.01.2011 в 13:08.
Adyvan вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ищу человека, хорошо знающего XNA ZaRDaK Фриланс 1 26.07.2010 22:21
Для меня сложно , для вас легко!!помогите!!! kirillbobo Помощь студентам 0 19.06.2009 21:32