Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Программа в ассемблере.помощь в коде, Нужна помощь в коде 
:(
    Опции темы
3a4eT
Дата 14.11.2010, 13:38 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 14.11.2010

Репутация: нет
Всего: нет



Есть задача готовая на ассемблере но незнаю функции каждой строки... т.е. что каждая функция делает просьба пояснить....


Само задание
Код
Написать подпрограмму заполнения области памяти с начала дополнительного сегмента (ES) 
последовательностью чередующихся байтов со значениями 0 и 0FFH (количество пар байтов задано в регистре CX) .


Сама программа
Код
1: write   proc near
2: pushf
3: push    di
4: push    ax
5: cld
6: xor     di, di
7: mov     ax, 00ffh
8: rep stosw
9: pop     ax
10: pop     di
11: popf
12: ret
13: write   endp


Это сообщение отредактировал(а) 3a4eT - 14.11.2010, 13:39
PM MAIL   Вверх
iff
Дата 14.11.2010, 15:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Администратор
**


Профиль
Группа: Участник
Сообщений: 949
Регистрация: 23.3.2007

Репутация: 5
Всего: 16





--------------------
DOS... Синей пеленой экран заполнил чистый DOS 
Мышь... Стала вдруг квадратной, потеряла форму мышь... 
Я разбил окно, девяностопятое мастдайное окно, 
И поставил DOS, и тогда увидел: Это счастье, — вот оно.  
PM MAIL WWW   Вверх
500mhz
  Дата 14.11.2010, 15:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


шайтан
***


Профиль
Группа: Завсегдатай
Сообщений: 1017
Регистрация: 5.5.2008
Где: Киев / Italy

Репутация: нет
Всего: 14



1) собственно декларация начала процедуры
2) сохраняем флаги
3) сохраняем di
4) сохраняем ax
5) обнуляем direction флаг
6) обнуляем di
7) заносим в ах 0х00FF
8) копируем 2 байта из ах начиная с адреса es:di количество раз указанное в сх
9) востанавливаем ах
10) востанавливаем di
11) востанавливаем флаги
12) go home


фсе


--------------------

PM MAIL ICQ   Вверх
3a4eT
Дата 14.11.2010, 15:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 14.11.2010

Репутация: нет
Всего: нет



iff, 
500mhz, 

Спасиб вам,оч помогли.
PM MAIL   Вверх
Bro058
Дата 2.12.2010, 17:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 28.1.2010

Репутация: нет
Всего: нет



Товарищи форумчане про шу вашей помощи и консультации. Весь курсач сам сделал(ну канешно сделал его по-дилетантски), но всё же сам.
Споткнулся на финальном моенте. 
Конкретнее:
 вылетает сообщение о делении на 0, хотя я не вижу деления на 0 (мож плохо смотрю)
вот сам код, проблема на этапе получения и вывода "кода разности" на экран, то есть если символ имеет ASCII-код 100, то мне надо вывести на экран цифру 255 - 100 = 155!!!! т.е. 155 на экран.
так вот тут я споткнулся и ничё дальше не идёт, а что самое обидное просто получение ASCII кода и вывод его на экран я прописал и он работает, а тут вот не получаеться никак(((
(если кто попробует помочь, при запуске введите 5-6 символов подряд и последним обязательно 'h')
код:
Код

stseg   segment para    stack
        dw      16      dup(?)
stseg   ends
dseg    segment para
 
path_and_name    DB             'C:\Tasm\Kursoff.txt',0
handle_of_file   DW             0
number           DB             18
read             DW             0
message1         DB             'Press any key to exit!$'
message2         DB             'Output text on print: $'
message3         DB             'Input text: $'
help_variable                DB   '000 $'     
Buffer           DB         30  DUP(0) 
help_param       DB             (?)
date             db        'Today is: 00.00.0000$'
month            db               (?)
day              db               (?)
year             dW               (?)
y                db                (?)
dseg    ends
cseg    segment para
lab1    proc    far
        assume  cs:cseg,ds:dseg,ss:stseg
        push    ds
        mov     ax,0            ; обнулить регистр АХ   
        push    ax              ; поместить в стек смещение адреса возврата=0
        mov     ax,dseg         ; инициировать адрес сегмента данных
        mov     ds,ax           ; загрузить адрес в регистр DS
 
mov ax, 03              ; очистка экрана
int 10h 
 
mov ah,09h              ; Вывод сообщения message3
lea dx,message3
int 21h
 
MOV  AH,3CH             ; Запрос на создание
MOV  CX,00              ; обычного файла
LEA  DX,path_and_name   ; ASCIIZ строка
INT  21H                ; Вызов DOS
 
MOV  handle_of_file,AX  ;Сохранение файлового ID в HANDLE
 
start_of_ENTER:
mov ah,01h              ; ввод вимволов с клаdиатуры в файл
int 21h
mov help_param,al       ; сразу передаём ACSII - код нажатой кклавиши в вспомогательную переменную
 
cmp help_param, 'h' 
je   end_of_ENTER         
 
LEA  DX,help_param      ; указываем адрес вспомогательной перменной, в которой храниться введёный символ
MOV  AH,40H             ; номер функции записи в файл
MOV  BX,handle_of_file  ; Файловый номер
MOV  CX,1               ; Длина записи
INT  21H
inc  read               ; 
dec  number             ; После каждого ввода символа значение пременной уменьшаеться на 1
jnz  start_of_ENTER
end_of_ENTER:
 
mov ah,42h              ; установка курсора в файле
mov al,00h
mov bx,handle_of_file
xor dx,dx
xor cx,cx
int 21h
 
mov ah,3fh                        ; функция чтения файла
mov bx,handle_of_file
mov cx,read                       ; сколько читать
mov dx,OFFSET Buffer        ; чиатем в буфер
int 21h                     ; выполнить
        
MOV  AH,3EH                 ; Запрос на закрытие файла
MOV  BX,handle_of_file      ; Файловый номер
INT  21H                    ; Вызов DOS
 
MOV  AH,02H                 ; Перевод курсора на новоую строку
mov  dh,01
mov  dl,00
int 10h
 
mov ah,09h                  ; Вывод сообщения message2
lea dx,message2
int 21h
 
mov si, read                ; вывод на экран символов в обратном порядке
dec si
output_on_print:
mov ah,02h
mov dl,Buffer[si]
int 21h
dec si
cmp si,0
JGE output_on_print
 
MOV  AH,02H                 ; Перевод курсора на новоую строку
mov  dh,02
mov  dl,00
int 10h
 
;-----------------------------------------код----------------
  
  xor si,si
code_take:
  mov al, buffer[si]
  mov help_variable,'0'
  mov dl,10
  mov di,2
convert_code:
  cbw
  div dl
  add ah,48
  mov help_variable[di], ah
  dec di
  cmp al, 10
  jae convert_code
  add al,48
  mov help_variable[di],al
  
  mov ah,09h                 ; Вывод кодов
  lea dx,help_variable
  int 21h
    
  inc si
  cmp si, read
  jne code_take
 ;--------------------------------------------------------------------------- 
 
MOV  AH,02H                 ; Перевод курсора на новоую строку
mov  dh,03
mov  dl,00
int 10h
 
;-----------------------------------------код разность----------------
xor ax,ax
 xor cx,cx    
xor si,si
 code_take_edition:
  mov cl, 255                  ; 255 в СL
  sub cl,buffer[si]            ; 255 - ACSII код символа в buffer[si]  
  
  mov al,cl                     ; заношу разность в AL
  mov help_variable,'0'
  mov dl,10
  mov di,2
convert_code_edition:
  cbw
  div dl
  add ah,48
  mov help_variable[di], ah
  dec di
  cmp al, 10
  jae convert_code_edition
  add al,48
  mov help_variable[di],al
  
  mov ah,09h                 ; Вывод кодов
  lea dx,help_variable
  int 21h
    
  inc si
  cmp si, read
  jne code_take_edition
 ;--------------------------------------------------------------------------- 
MOV  AH,02H                 ; Перевод курсора на новоую строку
mov  dh,04
mov  dl,00
int 10h
 
 
;-----ВЫВОД НА ЭКРАН ДАТЫ (DONT TOUCH THIS FRAGMENT!!! I'M WRITING IT HOLE WEEK!!!------------------
mov ah,2ah      ; функция на запрос текущей даты у системы
int 21h          
mov year, CX    ; год (формат BCD)
mov month, DH   ; месяц (формат BCD)
mov day, DL     ; день (формат BCD)
 
   mov cl,10         ; обработка "дня", перевод в ASCII-код 
   mov al, day
   mov si,11
convert1:
   cmp al,10
   jb end_convert1
   cbw
   div cl
   add ah,48
   mov date[si],ah
   dec si
   jmp convert1
end_convert1:
   add al,48
   mov date[si],al
 
   mov cl,10            ; обработка "месяца", перевод в ASCII-код
   mov al, month
   mov si,14
convert2:
   cmp al,10
   jb end_convert2
   cbw
   div cl
   add ah,48
   mov date[si],ah
   dec si
   jmp convert2
end_convert2:
   add al,48
   mov date[si],al
 
   mov ax,year      ; обработка "года", перевод в ASCII-код
   mov bx,10
   mov si,20
   xor cx,cx
 convert3:
   dec si
   xor dx,dx
   div bx
   add dl,48
   mov date[si],dl
   test ax,ax
   jnz convert3
 
mov ah,09h        ; Вывод полной текущей даты на экран в формате "дд.мм.гг"
lea dx,date
int 21h
 
;-----------КОНЕЦ ОБРАБОТКИ ДАННЫХ О ДТЕКУЩЕЙ ДАТЕ-------------------------------
 
 
MOV  AH,02H                 ; Перевод курсора на новоую строку
mov  dh,05
mov  dl,00
int 10h
 
 
mov ah,09h                  ; Вывод сообщения
lea dx,message1
int 21h
 
mov ah,01h              ; прерывание на ввод символа с клаиатуры
int 21h
        
ret
lab1    endp
cseg    ends
        end     lab1

чувствую, что надо исправить строки 3-4, но как не знаю, что - то не нравиться ему моё вычитание с помощью sub
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Asm: Общие вопросы"
MAKCim
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой КОД.
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Asm: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0466 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.