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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 26.03.2008, 16:39   #1
Almost_Famous
Пользователь
 
Регистрация: 28.02.2008
Сообщений: 13
По умолчанию Помогите с циклом

Помогите пожалуйста, написать следующую прогу на ассемблере:
Если число в состоит менее, чем из 3 десятичных цифр, сохранить их сумму, иначе сохранить 0.
Попробывал написать, ничего не получилось, как то даже слабо представляю, как сделать чтобы посчиталась сумма цифр в числе. Пордскажите пожалуйста что писать в for и end_if!

.MODEL SMALL
;----------Сегмент стека------------
STACKSG SEGMENT PARA STACK 'stack'
DB 256 DUP(?)
STACKSG ENDS
;-----------------------------------

;----------Сегмент данных-----------
DATASG SEGMENT PARA 'data'
KOL DW 100
REZ DB ?
DATASG ENDS
;----------------------------------

;----------Сегмент кода------------
CODESG SEGMENT PARA 'Code'
ASSUME CS:CODESG, DS:DATASG, SS:STACKSG
MAIN PROC FAR

PUSH DS ; Подготовка к
SUB AX,AX ; возврату в
PUSH AX ; ОС

MOV AX, DATASG ; Настраиваем DS на
MOV DS,AX ; сегмент данных

MOV AX,0
MOV CX,KOL ; Кол-во повторов цикла LOOP

For:

End_if:

MAIN ENDP
CODESG ENDS
END MAIN
Спасибо заранее!
Almost_Famous вне форума Ответить с цитированием
Старый 26.03.2008, 20:11   #2
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

Вот так можно подсчитать сумму цифр числа.

Код:

	mov	ax, 156 ; наше число
 	xor     dl, dl  ; здесь накапливается сумма цифр

	mov	bl, 10  ; делитель

     @@loop:
	div     bl
	                ; al - частное 
	                ; ah - остаток
	add     dl, ah
        xor     ah, ah
        cmp     ax, 0
        jne     @@loop 

        ; теперь dl - сумма цифр числа
alexBlack вне форума Ответить с цитированием
Старый 26.03.2008, 20:36   #3
Almost_Famous
Пользователь
 
Регистрация: 28.02.2008
Сообщений: 13
По умолчанию

Спасибо. Но я так до конца и не понял, считается арифмитическая сумма чисел или же просто считается кол-во цифр в числе?И еще был бы очень признателен,если бы помогли с самим циклом.как имеено написать, чтобы ассемблер понял что надор сравнивать кол-вл цифр с 3.И тут надо использовать for и end_if, или что то еще?Извините за такое большое кол-во вопросов, просто дали задание, ничего не объяснили...
Almost_Famous вне форума Ответить с цитированием
Старый 26.03.2008, 21:13   #4
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

Цитата:
Сообщение от Almost_Famous Посмотреть сообщение
Спасибо. Но я так до конца и не понял, считается арифмитическая сумма чисел или же просто считается кол-во цифр в числе?И еще был бы очень признателен,если бы помогли с самим циклом.как имеено написать, чтобы ассемблер понял что надор сравнивать кол-вл цифр с 3.И тут надо использовать for и end_if, или что то еще?Извините за такое большое кол-во вопросов, просто дали задание, ничего не объяснили...
Нужно просто добавить еще один счетчик:

Код:
	mov ax, 156 ; наше число   
    	xor     dx, dx  ; dl - накапливается сумма цифр   
                        ; dh - количество цифр
  
	mov bl, 10  ; делитель   
  
    @@loop:   
	div     bl   
                ; al - частное    
                ; ah - остаток   
	add     dl, ah   
        inc     dh
        xor     ah, ah   
        cmp     ax, 0  
        jne     @@loop    
  
        ; теперь dl - сумма цифр числа  
        ; dh - количество цифр
А теперь сравнение:

Код:

        cmp     dh, 3
        jb      @@below
        ; здесь >= 3
        jmp     @@exit 
       @@below:
        ; здесь меньше 3

       @@exit:
alexBlack вне форума Ответить с цитированием
Старый 26.03.2008, 21:30   #5
Almost_Famous
Пользователь
 
Регистрация: 28.02.2008
Сообщений: 13
По умолчанию

Спасибо огромное, у меня получился следующий алгоритм программы.
Код:

.MODEL SMALL

;----------Сегмент стека------------
STACKSG SEGMENT PARA STACK 'stack'
DB 256 DUP(?)
STACKSG ENDS
;-----------------------------------

;----------Сегмент данных-----------
DATASG SEGMENT PARA 'data'
KOL DW 156
REZ DB ?
DATASG ENDS
;----------------------------------

;----------Сегмент кода------------
CODESG SEGMENT PARA 'Code'
ASSUME CS:CODESG, DS:DATASG, SS:STACKSG
MAIN PROC FAR

PUSH DS ; Подготовка к
SUB AX,AX ; возврату в
PUSH AX ; ОС

MOV AX, DATASG ; Настраиваем DS на
MOV DS,AX ; сегмент данных

mov ax, kol ; наше число
xor dx, dx ; dl - накапливается сумма цифр
; dh - количество цифр

mov bl, 10 ; делитель

@@loop:
div bl
; al - частное
; ah - остаток
add dl, ah
inc dh
xor ah, ah
cmp ax, 0
jne @@loop

; теперь dl - сумма цифр числа
; dh - количество цифр

For: cmp dh, 3
jb @@below ; здесь >= 3
jnz end_if
mov rez, dl

End_if: MOV rez, 0 ; Переходим к след. элементу массива



MOV REZ,AL ;
RET ; Завершение работы
MAIN ENDP
CODESG ENDS
END MAIN

Но при попытке сделать tasm filename.asm пишется, что неправильный символ @@below.Скажите пожалуйста что тут не так...
Almost_Famous вне форума Ответить с цитированием
Старый 26.03.2008, 21:36   #6
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

А что-ж не все скопировал ?

jb @@below - переход на метку.

А где описание метки ?
alexBlack вне форума Ответить с цитированием
Старый 26.03.2008, 22:24   #7
Almost_Famous
Пользователь
 
Регистрация: 28.02.2008
Сообщений: 13
По умолчанию

Спасибо вроде теперь все понял, все скомпилировалось.Получилось следующие.

Код:
Код:
.MODEL SMALL

;----------Сегмент стека------------
STACKSG SEGMENT PARA STACK 'stack'
        DB      256  DUP(?)  
STACKSG ENDS
;-----------------------------------

;----------Сегмент данных-----------
DATASG  SEGMENT PARA  'data'
KOL     DW    156
REZ     DB     ?
DATASG ENDS
;----------------------------------

;----------Сегмент кода------------
CODESG  SEGMENT PARA 'Code'
        ASSUME  CS:CODESG, DS:DATASG, SS:STACKSG 
MAIN    PROC   FAR

	PUSH    DS          ; Подготовка к
	SUB     AX,AX	    ; возврату в
	PUSH    AX	    ; ОС

	MOV    AX, DATASG  ; Настраиваем DS на
	MOV    DS,AX	    ; сегмент данных

mov ax, kol ; наше число     
    xor     dx, dx  ; dl - накапливается сумма цифр     
                       ; dh - количество цифр  
   
mov bl, 10  ; делитель     
   
   @@loop:     
div     bl     
               ; al - частное      
               ; ah - остаток     
add     dl, ah     
       inc     dh  
       xor     ah, ah     
       cmp     ax, 0    
       jne     @@loop      
   
       ; теперь dl - сумма цифр числа    
       ; dh - количество цифр   
	
For:    cmp     dh, 3  
 jb      @@below  
 ; здесь >= 3  
 jmp     @@exit   
@@below:  
 ; здесь меньше 3  
  
@@exit:           
         jnz end_if
          mov rez, dl

End_if: MOV rez, 0		; Переходим к след. элементу массива
	
	
	
MOV    REZ,AL	; 
	RET             ; Завершение работы
MAIN    ENDP
CODESG  ENDS
        END    MAIN
Могли бы Вы сказать тут все правильно или есть еще какие-то недочеты?
Almost_Famous вне форума Ответить с цитированием
Старый 26.03.2008, 22:45   #8
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

Похоже ты так и не разобрался.

Код:
 cmp     dh, 3     
 jb      @@below     
 ; здесь >= 3, сохраняем 0     
 MOV rez, 0
 jmp     @@exit      
@@below:     
 ; здесь меньше 3, сохраняем сумму цифр     
  mov rez, dl
@@exit:
; дальше лишнее
; даже если к этому написать правильное условие
; все равно работать не будет. Попробуй выполнить на бумажке
; jnz end_if
; mov rez, dl
; End_if: MOV rez, 0 ; Переходим к след. элементу массива
; Вот этот комментарий непонятный. К какому элементу мы переходим ?
; MOV REZ,AL ; А теперь портим рещультат, да ?
; (все вопросы риторические)

Учись пользоваться отладчиком и читай книжки по асму. Удачи.
alexBlack вне форума Ответить с цитированием
Старый 27.03.2008, 21:08   #9
Almost_Famous
Пользователь
 
Регистрация: 28.02.2008
Сообщений: 13
По умолчанию

alexBlack
Спасибо большое!!!!
Almost_Famous вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема с циклом.. POPOV Помощь студентам 3 29.04.2008 18:36
Задача с циклом POPOV Общие вопросы Delphi 13 01.02.2008 20:33
Проблемы с циклом, условием Иринкаа Помощь студентам 13 19.11.2007 23:33