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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 03.08.2014, 16:15   #1
AndrP
Новичок
Джуниор
 
Регистрация: 03.08.2014
Сообщений: 2
По умолчанию Единица в девятом разряде

Всем привет!
До июля 2014 последний раз работал в Ассемблере в 1991-м. Работал в Паскале, Делфи, С++, и т.п. Попросил помощи племянник, работу я сделал, объяснил, и т.д. есть один трабл, я его объяснить не смог, ввел лишнюю команду и сказал, что "так нужно". От преподавателя замечаний не было. Прошу разъяснить, стало интересно (очень заинтересовался забытым мною и неимоверно эволюционировавшим языком программирования). Программеры на АСМе, я смотрю, прикалываются и шифруются. Без подколов - реал элита)))

Было задание - ввести два числа, обработать, и вывести вместе с промежуточными результатами в двоичной форме.

Времени было меньше, чем в обрез, поэтому вводил НЕ СТОКУ, БЕЗ ПРОВЕРКИ СИМВОЛОВ, а тупенько, подразумевая, что ткнут только цифру:
Код:
_read proc near
       push    bp
       mov     bp,sp
 
       mov     ah, 01h
       int     21h
       sub     al,30h
       mov     [bp+4],ax
 
       mov     sp,bp
       pop     bp
       ret
_read endp
Выводил данные в двоичном виде:
Код:
_write proc near
       push    bp
       mov     bp,sp
 
       mov     ax,[bp+4]
       mov     bx,ax
       mov     dx,7fffh 
       mov     cx,16
_div:
       mov     ax,bx
       or      ax,dx
       not     ax
       push    dx
       cmp     ax,0
       jnz     to0
       mov     dx,1
       jmp     toend
to0:  
       mov     dx, 0
toend:
       add     dx,30h
       mov     ah,02
       int     21h
       pop     dx
       shr     dx,1
       or      dx,8000h
       loop    _div
 
       mov     sp,bp
       pop     bp
 
   ret    
_write endp
При тестовом выводе заменял команду
Код:
mov     ax,[bp+4] на что-то типа 
mov     ax,000Bh и получал на мониторе что-то типа 0000000000001011 (красота!)
Но после выполнения и ввода цифры:
Код:
......................................
       call    _read
       pop     ax
.............................................
       push    ax
       call    _write
...............................................
получал число в двоичном виде 000000010000****

Для удаления единицы в 9-м разряде ввел дополнительную команду
Код:
      and     ax,00ffh для обнуления старших разрядов, и получил в рабочей программе (представлен урывок):
....................................................
       mov     dx, offset messa
       mov     ah, 09h
       int     21h
       call    _read
       pop     ax
       and     ax,00ffh
       mov     a,ax
       call    _ent
 
       mov     dx, offset messb
       mov     ah, 09h
       int     21h
       call    _read
       pop     ax
       and     ax,00ffh
       mov     dx,2
       mul     dx
       mov     b,ax
       call    _ent
 
       mov     dx, offset is2b
       mov     ah, 09h
       int     21h
       push    b
       call    _write
       call    _ent
....................................................
Все работает правильно, но это же не правильно, где моя недоумка? Подскажите!

Последний раз редактировалось Stilet; 03.08.2014 в 16:29.
AndrP вне форума Ответить с цитированием
Старый 04.08.2014, 08:04   #2
Mikl___
Участник клуба
 
Регистрация: 11.01.2010
Сообщений: 1,139
По умолчанию

AndrP,
ввод двух десятичных чисел (каждое число не более 65535), сложение и вывод результата на экран в двоичном виде
Код:
; masm dos com #
; ввести два числа, обработать, и вывести вместе с промежуточными результатами 
; в двоичной форме
.model tiny
.286
.code
org 100h
start:  mov ax,3
	int 10h
	mov dx,offset mes1
	call read
	mov A,dx
        mov dx,offset mes2
	call read
	mov B,dx
	xor dx,dx
	mov ax,A
	add ax,B
	adc dx,0
	mov sum,ax
        mov sum+2,dx
        mov dx,offset mes3
	mov ah,9
	int 21h
	mov ax,sum+2
	add al,'0'
	int 29h
	mov cx,16
	mov bx,sum
@0:	mov al,"0"
	shl bx,1
	adc al,0
	int 29h
	loop @0
	mov al,"B"
	int 29h
	mov ah,0
	int 16h
	ret
read proc
	mov ah,9
	int 21h	
	mov ah,0Ah
        mov dx,offset buffer
	int 21h
	mov ch,0
	mov cl,buffer+1
	mov si,offset buffer+2
	xor dx,dx
@1:	lodsb
	and ax,0Fh
	imul dx,10
	add dx,ax
	loop @1
	ret
read endp
buffer db 6,?,6 dup (?)
A dw ?;65535
B dw ?;65535
sum dw ?,?;131070
mes1 db "Введи число А не более 65535",0Dh,0Ah,"$"
mes2 db 0Dh,0Ah,"Введи число В не более 65535",0Dh,0Ah,"$"
mes3 db 0Dh,0Ah,"А+В равно $"
end start
Mikl___ вне форума Ответить с цитированием
Старый 04.08.2014, 12:21   #3
AndrP
Новичок
Джуниор
 
Регистрация: 03.08.2014
Сообщений: 2
По умолчанию

Mikl___, спасибо за код, пригодится.
Понятно, что при наличии большего количества времени, написали бы по другому, но в данном случае все было ооочень быстро.
Меня в данном случае больше интересует то, откуда единица взялась. Понятно, что при вводе, ведь в тестовом выводе все было нормально.
AndrP вне форума Ответить с цитированием
Старый 04.08.2014, 14:42   #4
Mikl___
Участник клуба
 
Регистрация: 11.01.2010
Сообщений: 1,139
По умолчанию

AndrP,
чтобы понять "откуда взялась единица?" стоило прикрепить ВСЮ программу вместе с числами, на которых получился неправильный результат. А вообще -- первейший инструмент для пишущего на ассемблере -- это отладчик, для DOS-программ подойдет и AFDPRO.EXE
Mikl___ вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Единица товара стоит a рублей b копеек... climp Паскаль, Turbo Pascal, PascalABC.NET 4 21.09.2012 08:39
Мнимая единица в С++ akhalex Общие вопросы C/C++ 17 20.07.2012 18:46
Как расшифровывается эта единица измерения? Stilet Общие вопросы по программированию, компьютерный форум 3 22.01.2010 11:42