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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 05.12.2009, 06:50   #1
Mixim
Форумчанин
 
Регистрация: 29.10.2009
Сообщений: 259
Вопрос Как проверить, верно ли считает программа?

Мне необходимо написать на TAsm'е программу, которая из 50 элементов массива находит нечетные отрицательные элементы. Написал следующий код:
Код:
model large
.stack 100h
.data
 mes1 db 'Ошибка ввода*!$'
 mes3 db 'Введите элемент a[$'
 mes4 db '] -> $'
 unset db 13,10,'$'
 a dw 1000 dup(?)
 n dw 50
 two dw 2
 ten dw 10
 zero dw 0
 i dw ?
 sum dd ?
 j dw ?

.code
; MOV Ax,3;
; INT 10h;

  finit
  .386
  mov ax,@data
  mov ds,ax


   mov cx,n
   mov i,1
   xor di,di
c1:
   push cx
   CMP i, 1
   JE WithoutNewLine
   lea dx,unset
   mov ah,9h
   int 21h
WithoutNewLine:
   lea dx,mes3
   mov ah,9h
   int 21h
    xor cx,cx
    mov ax,i
    mov bx,10
v1:
    xor dx,dx
    div bx
    push dx
    inc cx
    cmp ax,0
    jne v1
    mov ah,02h
v2:
    pop dx
    add dl,30h
    int 21h
   loop v2

    lea dx,mes4
    mov ah,9h
    int 21h
    add i,1
    xor si,si
    push bp
    mov bp,sp
    push 10
    push 0
    fldz
    mov ah,01h
    int 21h
    cmp al,'-'
    jne f1
    inc si
f0:
    mov ah,01h
    int 21h
f1:
    cmp al,0dh
    je f5
    cmp al,'.'
    je error
    cmp al,39h
    jna f3
    jmp error
f3:
    cmp al,30h
    jae f4
    lea dx,unset
    mov ah,9h
    int 21h
    jmp error
f4:
    sub al,30h
    mov [bp-4],al
    fimul word ptr [bp-2]
    fiadd word ptr [bp-4]
    jmp f0
f5:
    cmp si,0
    je f6
    fchs
f6:
    leave
    pop cx
    fistp a[di]
    cmp cx,1
    je h1
     add di,4
h1:
   dec cx
   cmp cx,0
   je e1
   jmp c1

MOV i, 50;
e1:
   CMP i, 0
   JE pause
   MOV Ax, a[di]
   DEC i
   DIV two
   CMP Dx, zero    
    JnE e1
   CMP Ax, zero  
   JL  vivod      
   JMP e1

vivod:
      mov ah,01h
  int 21h

      MOV Ax, a[di]  
      PUSH bp
      MOV bp, sp
      PUSH Ax
      PUSH dx
      PUSH si
      SUB Sp, 6      ;
      CMP dh, 1
      JNE pon0
      CMP Ax, 0
      JGE pon0
      MOV dh, 2
      NEG Ax
   pon0:
        PUSH dx     ;
        XOR si, si  ;
   ponl:
        MOV dx, 0
        DIV cs:ten  ;Ax=Ax div 10; dx=ax mod 10
        ADD dl, '0'
        MOV [bp-8+si], dl  ;
        INC si
        OR Ax, Ax
        JnZ ponl    ;Ґйс *Ґ 0
        POP dx
        CMP dh, 2
        JNE pon2
        MOV byte ptr [bp-8+si], '-'
        INC si
    pon2:
         MOV dh, 0   ;
         MOV ah, 2   ;
    pon2l:
         CMP dx, si
         JLE pon3    ;
         PUSH dx
         MOV dl, ' '
         INT 21h
         POP dx
         DEC dx
         JMP pon2l
    pon3:
         DEC si
         MOV dl, [bp-8+si]
         INT 21h
         OR si, si
         JNZ pon3
         ADD sp, 6
         POP si
         POP dx
         POP Ax
         POP bp
JMP e1


error:
  lea dx,unset
  mov ah,9h
  int 21h      
  lea dx,mes1
  mov ah,9h
  int 21h   
  pause:
  mov ah,01h
  int 21h
  mov ah,4ch
  int 21h

end
Заполнение массива вроди бы работает как надо, вычисления вродибы тоже должны идти нормально, но после выполнения программы, она сразу закрывается(не срабатывает pause). Подскажите пожалуйста, что необходимо исправить?
Из всех классических книг, посвященных программированию, ненавижу всего одну - русский перевод книги Роберта Седжвика-"Фундаментальные алгоритмы C++". Предпочитаю читать её в оригинале.
Mixim вне форума Ответить с цитированием
Старый 05.12.2009, 07:14   #2
Goodwin98
equ asm
Участник клуба
 
Аватар для Goodwin98
 
Регистрация: 02.05.2009
Сообщений: 1,605
По умолчанию

Цитата:
Как проверить, верно ли считает программа?
В отладчике смотреть. Он для того и придуман.

По поводу кода: Возможно стоит быть поаккуратнее с делением, в частности в строках
Код:
   MOV Ax, a[di]
   DEC i
   DIV two
невижу, где бы обнулялся регистр dx. Кстати а что там делится ? Если знаковые числа, то возможно стоит делать так :
Код:
cwd ; знаковое расширение ax на dx
idiv two ; знаковое деление
Какой вопрос - такой ответ. Не забываем пользоваться поиском, гуглом.
Помощь в выполнении работ по ассемблеру ICQ:2725322O4
Goodwin98 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
fgets - работает не верно, и вообще тупит heart C++ Builder 14 29.11.2009 15:55
Программа считает пробел за конец строки AxenicX Общие вопросы C/C++ 3 12.11.2009 10:16
BitButton не верно грузится изображение к кнопке volovikov Общие вопросы Delphi 7 19.07.2009 00:31
Программка в Борланд Си... Программа есть... Ошибку не высвечивает но и не считает... Спасайте... Катюшенька Помощь студентам 1 18.05.2009 22:21
[B]Народ! Проверки мне верно или не верно? мне надо завтра сдавать[/B] Vladislav_87 Паскаль, Turbo Pascal, PascalABC.NET 6 04.06.2008 14:34