Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Макросы.. помогите решить, переделать прогу  
:(
    Опции темы
vudu91
  Дата 4.11.2009, 14:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Я только начал учить асм. и передомной поставили задачу 
1. написать програму для простого вивода числа, вот код.. 
Код

G  SEGMENT  PARA  STACK  "STACK"
 db 64 dup('stack')
 STSEG  ENDS

DATA  SEGMENT  PARA  PUBLIC  "DATA"
massage  db ""
massage1 db "Enter a number:$"
massage2 db "Do you want to exit? y(yes)/n(not)$"
massage3 db 10,13,"Characters that were entered: $"
massage4 db 10,13,"A number is entered: $"
massage_error3 db "You entered space!!!Please enter number without gap(space).",10,13,'$'
massage_error2 db "You entered a too large number!!!",10,13,"The entered number must be in a range[-32767;32767].",10,13,'$'
massage_error1 db "You entered character!!!",10,13,'$'
TransitionLine db 13,10,'$';перехід каретки на нову стрічку
SizeBuffer db 7;кількість символів
blenth db ?
bcontents db 7 dup(?)
x dw 0
n dw 1
DATA  ENDS

;===========================сегмент коду==================== 
CODE  SEGMENT PARA PUBLIC  "CODE"
MAIN  PROC  FAR
ASSUME  CS: CODE, DS: DATA, SS: STSEG
;============================================================
mov ax,data
mov ds,ax
again1:
call Clrscr
begin1:
call EnterData
call Print
call Exit

MAIN ENDP



;=========функція виводу повідомлення вводу========
EnterData :    
    mov ah,9
       lea dx,massage1
       int 21h
       lea dx,SizeBuffer
       mov ah,0Ah
       int 21h
       lea dx,TransitionLine
       mov ah,09h
       int 21h
ret      
;===================================================
;=========функція виходу============      
Exit :     
    mov ah,09h
     lea dx,TransitionLine
       int 21h
    mov ah,9
    lea dx,massage2
    int 21h
    exit2:
    mov ah,08h
      int 21h
    cmp al,'n'
     je again1
     cmp al,'y'
     je exit1
     cmp al,'n'
     jne exit2
    exit1:
     mov ax,4C00h
    int 21h
ret
;====================================

;==========очистка екрану============
Clrscr:
    mov ax,0003h
    int 10h
ret
;====================================

;==========перетворення в число====================================
ConvertingNumberToHex:
    xor si,si
    xor ax,ax
    xor cx,cx
    mov cl,blenth
    mov di,cx
    
label1:    
    xor bx,bx
    mov bl,byte ptr bcontents[di-1]
    cmp bl,'-'
    jne per
    cmp di,1
    je label8 
    call error1
    
per:    cmp bl,'+'
    jne per1
    cmp di,1
    je label8 
    call error1
    
per1:    cmp bl,' '
    jne per2 
    call error3 
    
per2:    cmp bl,'    '
    jne label4
    call error3 
    
    
    
label8:
    ret
label4:    
    sub bl,'0';перевірка на символи
    cmp bl,9
    jna label5 
    call error1
    
    
label5:
    cmp di,cx
    je label2
    push ax ;записати число 
    
    mov ax,bx
    mov bx, 10
    mov cx,si
label3:
    imul bx
    jno label6 ;перевірка переповнення
    call error2
    
label6:
    loop label3
    mov bx,ax
    pop ax ;зчитати попередній результат
    
label2:

    add ax,bx ;додати попередній і теперишній результатит
    jno label7
    call error2
    
label7:
    dec di
    inc si
    cmp di,0
    jne label1
ret
;==================================================================

;====================помилка вводу(введено сивол)==================
error1:
    mov ah,9
       lea dx,massage_error1
       int 21h
          jmp begin1
ret
;==================================================================
;====================помилка вводу(введено пробел)==================
error3:
    mov ah,9
       lea dx,massage_error3
       int 21h
          jmp begin1
ret
;==================================================================

;====================помилка вводу(переновнення)==================
error2:
    mov ah,9
       lea dx,massage_error2
       int 21h
          jmp begin1
ret
;==================================================================

;====================переводимо із 16 в 10ричну ситему=============
ConvertingNumberToDec:

    xor bx,bx
    mov bx,x
    or bx,bx;
    jns m1
    mov al,'-'
    int 29h
    neg bx
m1:
    mov ax,bx
    xor cx,cx 
    mov bx,10 
m2:
    xor dx,dx
    div bx
    add dl,'0'
    push dx
    inc cx
    test ax,ax
    jnz m2
m3:
    pop ax
    int 29h
    loop m3

ret
;==================================================================

;===================вивести відповідь на монітор===================
Print:
    call ConvertingNumberToHex
    mov x,ax
    xor bx,bx
    mov bl,byte ptr bcontents
    cmp bl,'-'  ;перевырка на від'ємність числа
    jne j1
    neg ax
    mov x,ax
j1:
    mov ah,9h
    lea dx,massage4    
    int 21h
    
    call ConvertingNumberToDec

    
    mov ah,09h;робимо отступ
     lea dx,TransitionLine
       int 21h
ret
;==================================================================

CODE ENDS
END MAIN

работает вроде нормально...
а потом переделать этуже прогу с используванием макросов..
я чтото творил, ну есть ошыбка... помогите, кто может, переделать эту програму из используванием макросов

вот код тот что я делал, может ктото подскажет как устранить ошибку
Код

;=макрос настройки ds на сегмент данных
init_ds    macro
    mov    ax,data
    mov    ds,ax
    xor    ax,ax
endm
;====================================
;==========очистка екрану============
Clrscr macro
    mov ax,0003h
    int 10h
endm
;====================================
;==========вивід повідомлення========
out_str macro str    
    
    mov ah,09h
     lea dx,str
       int 21h
endm
;====================================
;=========вихiд============      
Exit macro     
    mov ax,4C00h
    int 21h
endm
;====================================
EnterData macro n    
    lea dx,SizeBuffer
       mov ah,n
       int 21h
endm      
;===================================================
;==============обнуляємо число======================
clear_r macro rg
    xor rg,rg
endm
;===================================================
;==============виводим al======================
print_al macro rg
    mov al,rg
    int 29h
endm
;===================================================
;====================переводимо із 16 в 10ричну ситему=============
ConvertingNumberToDec macro

    clear_r bx
    mov bx,x
    or bx,bx;
    jns m1
    ;print_al
    mov al,'-'
    int 29h
    neg bx
m1:
    mov ax,bx
    clear_r cx 
    mov bx,10 
m2:
    clear_r dx
    div bx
    add dl,'0'
    push dx
    inc cx
    test ax,ax
    jnz m2
m3:
    pop ax
    int 29h
    loop m3

endm
;==================================================================
;==================помтлка==========================
error macro str
    mov ah,9
       lea dx,str
       int 21h
          jmp begin1
endm
;===================================================

;==========перетворення в число====================================
ConvertingNumberToHex macro
    clear_r si
    clear_r ax
    clear_r cx
    mov cl,blenth
    mov di,cx
    
label1:    
    xor bx,bx
    mov bl,byte ptr bcontents[di-1]
    cmp bl,'-'
    jne per
    cmp di,1
    je label8 
    error massage_error1
    

    
label7:
    dec di
    inc si
    cmp di,0
    jne label1
    jmp label8
    
per:    cmp bl,'+'
    jne per1
    cmp di,1
    je label8 
    error massage_error1
    
per1:    cmp bl,' '
    jne per2 
    error massage_error3 
    
per2:    cmp bl,'    '
    jne label4
    error massage_error3  
label4:    
    sub bl,'0';перевірка на символи
    cmp bl,9
    jna label5 
    error massage_error1
label5:
    cmp di,cx
    je label2
    push ax ;записати число 
    
    mov ax,bx
    mov bx, 10
    mov cx,si
label3:
    imul bx
    jno label6 ;перевірка переповнення
    error massage_error2
    
label6:    
    loop label3
    mov bx,ax
    pop ax ;зчитати попередній результат
label2:
    add ax,bx ;додати попередній і теперишній результатит
    jno label7
    error massage_error2
label8:
endm
;==================================================================

;===================вивести відповідь на монітор===================
Print macro
    ConvertingNumberToHex
    mov x,ax
    clear_r bx
    mov bl,byte ptr bcontents
    cmp bl,'-'  ;перевырка на від'ємність числа
    jne j1
    neg ax
    mov x,ax
j1:
    out_str massage4
    
    ConvertingNumberToDec

    out_str TransitionLine
       
endm
;==================================================================
STSEG  SEGMENT  PARA  STACK  "STACK"
 db 64 dup('stack')
 STSEG  ENDS

DATA  SEGMENT  PARA  PUBLIC  "DATA"
massage  db ""
massage1 db "Enter a number:$"
massage2 db "Do you want to exit? y(yes)/n(not)$"
massage3 db 10,13,"Characters that were entered: $"
massage4 db 10,13,"A number is entered: $"
massage_error3 db "You entered space!!!Please enter number without gap(space).",10,13,'$'
massage_error2 db "You entered a too large number!!!",10,13,"The entered number must be in a range[-32767;32767].",10,13,'$'
massage_error1 db "You entered character!!!",10,13,'$'
TransitionLine db 13,10,'$';перехід каретки на нову стрічку
SizeBuffer db 7;кількість символів
blenth db ?
bcontents db 7 dup(?)
x dw 0
n dw 1
DATA  ENDS

;===========================сегмент коду==================== 
CODE  SEGMENT PARA PUBLIC  "CODE"
MAIN  PROC  FAR
ASSUME  CS: CODE, DS: DATA, SS: STSEG
;============================================================
    init_ds
again2:
    Clrscr
begin1:
    out_str massage1
    EnterData 0Ah
    
    out_str TransitionLine
    Print
again1: jmp again2
    out_str TransitionLine
    out_str massage2 
exit2:
    EnterData 08h
    
    cmp al,'n'
     je again1
     cmp al,'y'
     je exit1
     jmp exit2
exit1:
    Exit

MAIN ENDP
CODE ENDS
END MAIN
  
PM MAIL   Вверх
vudu91
Дата 4.11.2009, 22:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



ну помогите плиз smile  smile  smile 
неужели никто не знает что можно сделать?? 
может какието полезные ссылки, книги smile  smile  smile ...

PM MAIL   Вверх
AndNot
Дата 5.11.2009, 21:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



А что нужно то? В пакете TASM, в папке EXAMPLES\WHERIES, есть уже готовые макросы для ввода/вывода на все случаи жизни. Они оптимальны, как работе, так и по удобству. Может проще воспользоваться ими? К тому же они описаны подробно и есть примеры их применения.
PM MAIL   Вверх
vudu91
Дата 9.11.2009, 17:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



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

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

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


 




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


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

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