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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 27.12.2011, 05:48   #1
Хомячка
Новичок
Джуниор
 
Регистрация: 27.12.2011
Сообщений: 2
Вопрос Таблица умножения...

Дамы и Господа, знающие асемблер, помогите пожалуйста разобраться с программой, ибо моих знаний недостаточно чтобы написать нормально программку для зачёта.

Задача: вывести таблицу умножения в файл.

Но она записывает в файл лишь первую строку, а далее - зацикливается...

Код:
masm                    
model   small       
    
.data                   
mn_1	db	0
mn_2	db	0

opis	dw	0
str0	db	'000','$'
str1	db	"Tabli.txt",0
str2	db	10,13
sch1	db	0
sch2	db	0
eos    db      10, 13, '$'

.stack                  
        db      256     dup ('?')    
  
.code                  
main    proc           
        mov  ax,@data    
        mov  ds,ax 
        mov  es, ax 

	mov  ah,3ch
	mov  dx,offset str1
	mov  cx,0
	int  21h

	mov  opis,ax

	mov ah,3dH
	mov dx,offset str1
	mov al,1
	int 21h
	

	mov sch1,9
M1:
	inc mn_1


	mov sch2,9
M2:
	inc mn_2

	mov al,mn_1
	mul mn_2

	
Del:
	mov bl,10
	div bl

	add ah,30h
	mov str0,byte ptr ah

	cmp al,0
	jne Del	

	mov ah,40h
	mov bx,opis
	mov dx,offset str0
	mov cx,1
	int 21h

	dec sch2
	cmp sch2,0
	jne M2

mov ah,40h
mov bx,opis
mov dx,offset str2
mov cx,1
int 21h

	dec sch1
	cmp sch1,0
	jne M5

M5:
	jmp M1

Exit:
	mov ah,3eh
	mov bx,opis
	int 21h

	mov ax,4c00h
	int 21h
main endp
end main



___________
Код нужно оформлять по правилам:
тегом [CODE]..[/СODE] (это кнопочка с решёточкой #)
Не забывайте об этом!
Модератор.

Последний раз редактировалось Serge_Bliznykov; 27.12.2011 в 09:34.
Хомячка вне форума Ответить с цитированием
Старый 27.12.2011, 13:40   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

так пойдёт?

Код:
;Задача: вывести таблицу умножения в файл.


model   small       
    
.data                   
  mn_1    db      0
  mn_2    db      0

  opis    dw      0
  str0    db      '000','$'
  str1    db      "Tabli.txt",0
  str2    db      10,13
  sch1    db      0
  sch2    db      0
  eos     db      10, 13, '$'
  StrForConvert db 6 dup (?), " " ; Резервируем 6 байт для строки конвертации
  StrForConvertEnd = $-2     ; Указывает на последний байт строки, исключая концевой пробел

.stack  100h
  
.code                  
main    proc           
        mov  ax,@data    
        mov  ds,ax 
        mov  es, ax 

        mov  ah,3ch
        mov  dx,offset str1
        mov  cx,0
        int  21h

        mov  opis,ax

        mov ah,3dH
        mov dx,offset str1
        mov al,1
        int 21h
        

        mov mn_1, 0 
        mov sch1,9
M1:
        inc mn_1

        mov mn_2, 0 
        mov sch2, 9
M2:
        inc mn_2

        mov al,mn_1
        mul mn_2


        call Convert_AX_To_String   ; преобразовать число в строку
        inc cx                      ; пробел тоже напечатаем, чтобы числа отделялись друг от друга пробелом 
        mov bx,opis                 ; в BX загрузим хендл файла
        mov ah, 40h                 ; установим функцию записи
        int 21h                     ; выполнить запись в файл 

        dec sch2
        cmp sch2,0
        jne M2

        mov ah,40h
        mov bx,opis
        mov dx,offset str2
        mov cx,2
        int 21h

        dec sch1
        cmp sch1,0
        jne M1

Exit:
        mov ah,3eh
        mov bx,opis
        int 21h

        mov ax,4c00h
        int 21h

;------------------------------------------------------------------------------------
; Преобразовать значение регистра AX в его десятичное представление (в виде строки)
;   на входе AX, 
;  на выходе - строка в StrForConvert, 
;           адрес начала строки в DS:DX, счётчик символов - в CX
;------------------------------------------------------------------------------------
Convert_AX_To_String:
   push bx

   std                ; Устанавливаем ОБРАТНЫЙ порядок записи 
                      ;   (справа налево - в направлении уменьшения адресов )
   lea di,StrForConvertEnd-1 ; ES:DI = последний символ строки String

   ;  в AX число для перевода

; Начинаем перевод числа AX в строку
   mov cx,10          ; Задаемся делителем CX = 10
   mov bx,0           ; длина строки
Repeat:
   xor dx,dx          ; Обнуляем DX (для деления)
   div cx             ; Делим DX:AX на CX (10),
                      ; Получаем в AX частное, в DX остаток
   xchg ax,dx         ; Меняем их местами (нас интересует остаток)
   add  al,'0'        ; Получаем в AL символ десятичной цифры
   stosb              ; И записываем ее в строку
   inc  bx            ; увеличим счётчик символов
   xchg ax,dx         ; Восстанавливаем AX (частное)
   or ax,ax           ; Сравниваем AX с 0
   jne Repeat         ; Если не ноль, то повторяем

   mov cx, bx
   pop bx

   cld   ; восстановим значение DF - сравнение в направлении возрастания адресов

   lea dx,[di+1]      ; Заносим в DX адрес начала строки
   ret

main endp
end main
Serge_Bliznykov вне форума Ответить с цитированием
Старый 27.12.2011, 21:04   #3
Хомячка
Новичок
Джуниор
 
Регистрация: 27.12.2011
Сообщений: 2
По умолчанию

Оооо... СПАСИБО ОГРОМНОЕ!!!!!
Вы спасли мой зачёт... =^_^=
Хомячка вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
таблица умножения Ast PHP 5 26.12.2011 16:12
Таблица умножения на 5(1-9)! Amir93 Паскаль, Turbo Pascal, PascalABC.NET 1 09.12.2011 20:35
таблица умножения narco3 Помощь студентам 2 04.10.2011 20:11
Таблица умножения romantik2011 PHP 3 11.08.2011 19:24
Таблица умножения Golovastik Общие вопросы C/C++ 18 25.07.2009 23:46