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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 14.11.2009, 02:00   #1
lordus
 
Регистрация: 12.11.2009
Сообщений: 3
По умолчанию Вычитание и LOOP

Возникла проблема с вычитанием многоразрядных цифр. По идее программа представленная ниже должна брать каждый разряд и вычитать одно число от другого. В случае если происходит овычитание от меньшого, болешее число, соответственно происходит какбы заем, и в флаг CF заноситься еденица. Все так происходит, пока не прохождение прохождение цикла и "loop - а10" почему то обнуляет этот флаг, соответственно зайом не происходит и следующий разряд остается на еденицу больше, нежели он должен быть. Когда за таким принципом произвожу сложение(с помощью команд adc и aaa) то "loop" флаг не обнуляет, перенос разряда происходит корректно и ответ правильный.

Почему "loop" обнуляет флаг "CF" при вычитании и не трогает при сложении?


Код:
	;Программа віднімає два багаторозрядних числа 

.MODEL small
.STACK 100h
.DATA

	CR_LF  		db 13,10,"$"
	A			db '911'
	B			db '199'
	V			db 15 dup("$")
	Result		db 15 dup("$")	

.CODE
Main:
;занесення всіх даних з .DATA до стеку "ds"
	mov ax, @Data
	mov ds, ax

	
	CLC
	lea si, A+2			;в регістр заноситься адреса:зміщеня останьої цифри з першого багаторозрядного числа
	lea di, B+2			;в регістр заноситься адреса:зміщеня останьої цифри з другого багаторозрядного числа
	lea bx, Result+3	;в регістр заноситься адреса:зміщеня останьої позиції куди буде занесно результат багаторозрядного числа
	mov cx, 03			;встановлюємо щетчик для циклу
a10:
	xor ah, ah
	mov al,[si]		;в AL заноситься значення з першого багаторозряного числа "А"
	sub al, [di]	;віднімається перше число від другого
	aas				;корректне віднімання ASCII чисел	
	mov	[bx],al		;результат AAS заносимо до "Result"	
	dec si				
	dec di				
	dec bx
	loop a10

	mov ah, 00h; В СЛУЧАЕ СЛОЖЕНИЯ НУЖНО УБРАТЬ
	mov [bx], ah		;в разі якщо в останній ітерації циклу був перенос від заноситься до "Result"
	lea bx, Result+3	;занесення до регістра адреси:зміщення для того щоб почати переводити отриману суму в 16-ий ASCIIкод
	mov cx, 04			;встановлюємо щетчик для циклу
a20:
	or byte ptr [bx], 30h	;ми вказуємо, що беремо з па*яті один байт  і робимо побітне "або"  для того, щоб перевести цифри в ASCII символи
	dec bx
	loop a20
	
	
	; переведення строки - аналог /n
    mov ah, 09h				;функція виведення на екран
    mov dx, offset CR_LF
    int 21h
	mov ah, 09h	
    mov dx, offset Result
	int 21h
	

	
;завершеня программи	
	mov	ax, 4c00h
    int	21h
END Main
lordus вне форума Ответить с цитированием
Старый 14.11.2009, 17:20   #2
alexcoder
Форумчанин
 
Регистрация: 31.05.2009
Сообщений: 786
По умолчанию

Код:
.MODEL small
.STACK 100h
.DATA

	CR_LF  		db 13,10,"$"
	A			db '911'
	B			db '199'
	V			db 15 dup("$")
	Result		db 15 dup("$")	

.CODE
Main:
;занесення вс?х даних з .DATA до стеку "ds"
	mov ax, @Data
	mov ds, ax

	
	lea si, A+2			;в рег?стр заноситься адреса:зм?щеня останьої цифри з першого багаторозрядного числа
	lea di, B+2			;в рег?стр заноситься адреса:зм?щеня останьої цифри з другого багаторозрядного числа
	lea bx, Result+3	;в рег?стр заноситься адреса:зм?щеня останьої позиц?ї куди буде занесно результат багаторозрядного числа
	mov cx, 03			;встановлюємо щетчик для циклу
	xor ah, ah
	CLC
a10:
	mov al,[si]		;в AL заноситься значення з першого багаторозряного числа "А"
	sbb al, [di]	;в?дн?мається перше число в?д другого
	aas				;корректне в?дн?мання ASCII чисел	
	pushf
	add al,'0'
	popf
	mov	[bx],al		;результат AAS заносимо до "Result"	
	dec si				
	dec di				
	dec bx
	
	loop a10

	mov ah, 00h; В СЛУЧАЕ СЛОЖЕНИЯ НУЖНО УБРАТЬ
	mov [bx], ah		;в раз? якщо в останн?й ?терац?ї циклу був перенос в?д заноситься до "Result"
	lea bx, Result+3	;занесення до рег?стра адреси:зм?щення для того щоб почати переводити отриману суму в 16-ий ASCIIкод
	mov cx, 04			;встановлюємо щетчик для циклу
a20:
	or byte ptr [bx], 30h	;ми вказуємо, що беремо з па*ят? один байт  ? робимо поб?тне "або"  для того, щоб перевести цифри в ASCII символи
	dec bx
	loop a20
	
	
	; переведення строки - аналог /n
    mov ah, 09h				;функц?я виведення на екран
    mov dx, offset CR_LF
    int 21h
	mov ah, 09h	
    mov dx, offset Result
	int 21h
	

	
;завершеня программи	
	mov	ax, 4c00h
    int	21h
END Main
1 cf сбрасывает не loop, а xor
2 чтобы учитывать заем, нужно вычитать при помощи sbb, а не sub
3 после коррекции нужно приводить BCD в ASCII
Помощь с программами:
vk.com/alexcoder1
e-mail: informatik101@mail.ru
alexcoder вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
вычитание с переводом в двоичную систему strateg66 Помощь студентам 5 07.10.2009 17:45
Вычитание avnsanto Microsoft Office Excel 0 24.07.2009 02:33
Assignment to FOR-Loop variable zotox Помощь студентам 4 24.03.2009 11:32
Вычитание чисел по основанию 4 и 16. Stager Общие вопросы C/C++ 1 21.01.2009 00:13
вычитание даты zetrix Microsoft Office Excel 3 10.11.2006 06:30