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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 07.05.2017, 10:55   #1
Reatar
 
Регистрация: 14.12.2016
Сообщений: 9
По умолчанию Система неравенств

Помогите разобраться с y2, мне кажется, что из-за него ответ в некоторых случая неправильный.
Код:
MODEL SMALL
STACK 100h
.data
endl db 10,13,'$'

a db ?
x db ?
InputX db 0ah,0dh,"Please input X = $ "
InputA db 0ah,0dh,"Please input A = $ "
Answery1y2 db 0ah,0dh,"y1 + y2 = $ "
y1 db ?
y2 db ?
.code
Start:
mov ax,@data
mov ds,ax
xor ax,ax

lea dx,InputA   ;Вывод сообщения
mov ah,09h
int 21h

mov ah,01h      ;read(a) ->al
int 21h
mov a,al
sub a,30h       ;Перевести в число

xor ax,ax
lea dx,InputX   ;Вывод сообщения
mov ah,09h
int 21h
	
mov ah,01h      ;read(x) ->al
int 21h
mov x,al
sub x,30h       ;Перевести в число


yy1:
mov al,x
cmp al,4
jle eslimenshe
eslibolshe: 
mov bl,x
sub bl,a
mov y1,bl
jmp yy2

eslimenshe:
mov al,4
mul x
mov y1,al

yy2:
mov al,x
mov bl,2
div bl
cmp ah,0
je eslichet
esliNechet:
mov y2,7
eslichet:
mov al,x
mov bl,2
div bl
add al,a
mov y2,al

xor ax,ax
mov al,y1
add al,y2
	
;вывод суммы цифр
    aam 
    add ax,3030h 
    mov dl,ah 
    mov dh,al 
    mov ah,02h 
    int 21h 
    mov dl,dh 
    int 21h

mov dx,offset endl 
mov ah,09h
int 21h	      
exit:
mov ax,4c00h       
Int 21h
End Start
Изображения
Тип файла: png 2017-05-07 (2).png (18.3 Кб, 165 просмотров)
Reatar вне форума Ответить с цитированием
Старый 07.05.2017, 12:48   #2
R71MT
Участник клуба
 
Аватар для R71MT
 
Регистрация: 16.06.2011
Сообщений: 1,428
По умолчанию

Reatar, возьми за правило, что перед делением нужно очищать место под остаток.
Если ты делишь байт-на-байт, то очищать нужно регистр(AH), если слово-на-слово регистр(DX).
Очищать можно инструкциями: или 'XOR', или 'CBW/CWD' (соответственно для байта или слова).
Теперь попробуй исправить свой код, например так:
Код:
;......
yy2:
   mov  al,x
   mov  bl,2
   cbw                ; Convert Byte to Word
   div  bl
   cmp  ah,0
   je   eslichet

; или так...
;---------------
eslichet:
   mov  al,x
   mov  bl,2
   xor  ah,ah         ; очистить AH
   div  bl
   add  al,a
   mov  y2,al
Нашедшего выход - затаптывают первым..
R71MT вне форума Ответить с цитированием
Старый 07.05.2017, 21:28   #3
7in
(aka Jin X) !RTFM!
Форумчанин
 
Аватар для 7in
 
Регистрация: 14.12.2014
Сообщений: 295
По умолчанию

Ну я бы не назвал это "под остаток" , скорее во избежание переполнения при делении...
Делаю лабы на Asm/Delphi/C++/Python/VBA(Excel): asmlabs.ru
7in вне форума Ответить с цитированием
Старый 10.05.2017, 10:08   #4
Mikl___
Участник клуба
 
Регистрация: 11.01.2010
Сообщений: 1,139
По умолчанию

R71MT,
CBW, CWD, CWDE, CDQ, CDQE, CQO нужно использовать только при знаковом делении, при беззнковом используют SUB DX,DX/XOR DX,DX/Mov DX,0 иначе, если AX>7FFF, деление даст неверный результат
Mikl___ вне форума Ответить с цитированием
Старый 10.05.2017, 16:14   #5
R71MT
Участник клуба
 
Аватар для R71MT
 
Регистрация: 16.06.2011
Сообщений: 1,428
По умолчанию

Сам всегда юзаю XOR, и признаюсь, что об этой особенности CBW впервые слышу.
Mikl___ спасибо. Буду иметь в виду..
Нашедшего выход - затаптывают первым..

Последний раз редактировалось R71MT; 10.05.2017 в 16:16.
R71MT вне форума Ответить с цитированием
Старый 11.05.2017, 17:22   #6
Cuprum5
Форумчанин
 
Регистрация: 09.05.2017
Сообщений: 735
По умолчанию

Здорово, парни, а как очищать регистр(или число) командами cbw/cwde. Я что-то посмотрел и это команды расширения байта в слово(cbw) и слова в eax(cwde), а как там что очищается что-то я не понял? Объясните, пожалуйста.
Напишу программу на C++ и Asm для AVR. Черчение: sergeisky@yahoo.com.
Cuprum5 вне форума Ответить с цитированием
Старый 11.05.2017, 22:13   #7
R71MT
Участник клуба
 
Аватар для R71MT
 
Регистрация: 16.06.2011
Сообщений: 1,428
По умолчанию

Cuprum5 эти инструкции очищают только EAX/EDX и их половинки.
Скачай отладчик GRDB, занеси в регистры EAX/EDX какие-нибудь значения и посмотри, какие команды что очищают. Пока не пощупаешь ручками, ничё не поймёшь
Нашедшего выход - затаптывают первым..
R71MT вне форума Ответить с цитированием
Старый 11.05.2017, 22:28   #8
7in
(aka Jin X) !RTFM!
Форумчанин
 
Аватар для 7in
 
Регистрация: 14.12.2014
Сообщений: 295
По умолчанию

Cuprum5,
• CBW (AL->AX): если старший бит AL (AL and 80h) = 0 (т.е. число неотрицательное), то AH = 0, иначе AH = 0FFh
• CWD (AX->DX:AX): если старший бит AX (AX and 8000h) = 0 (т.е. число неотрицательное), то DX = 0, иначе DX = 0FFFFh
• CWDE (AX->EAX): если старший бит AX (AX and 8000h) = 0 (т.е. число неотрицательное), то старшее слово EAX = 0, иначе старшее слово EAX = 0FFFFh (аналогично movsx eax,ax)
• CDQ (EAX->EDX:EAX): если старший бит EAX (EAX and 80000000h) = 0 (т.е. число неотрицательное), то EDX = 0, иначе EDX = 0FFFFFFFFh
• CDQE (EAX->RAX): если старший бит EAX (EAX and 80000000h) = 0 (т.е. число неотрицательное), то старшее двойное слово RAX = 0, иначе старшее двойное слово RAX = 0FFFFFFFFh (аналогично movsxd rax,eax)
• CDO (RAX->RDX:RAX): если старший бит RAX (RAX and 8000000000000000h) = 0 (т.е. число неотрицательное), то RDX = 0, иначе RDX = 0FFFFFFFFFFFFFFFFh
Делаю лабы на Asm/Delphi/C++/Python/VBA(Excel): asmlabs.ru
7in вне форума Ответить с цитированием
Старый 11.05.2017, 22:34   #9
7in
(aka Jin X) !RTFM!
Форумчанин
 
Аватар для 7in
 
Регистрация: 14.12.2014
Сообщений: 295
По умолчанию

Обнуление:
• xor ah,ah (AL->AX): AH = 0
• xor dx,dx (AX->DX:AX): DX=0
• movzx eax,ax (AX->EAX): старшее слово EAX = 0
• xor edx,edx (EAX->EDX:EAX): EDX = 0
• mov eax,eax (EAX->RAX): старшее двойное слово RAX = 0... да тут такой прикол – при записи в двойное слово, старшее двойное слово 64-битного регистра (R-регистра) очищается
• xor edx,edx (RAX->RDX:RAX): RDX = 0... здесь аналогично (старшая часть RDX тоже очистится). Можно использовать, конечно, и xor rdx,rdx (но такая инструкция длиннее на байт )
Делаю лабы на Asm/Delphi/C++/Python/VBA(Excel): asmlabs.ru

Последний раз редактировалось 7in; 11.05.2017 в 22:42.
7in вне форума Ответить с цитированием
Старый 12.05.2017, 13:42   #10
Cuprum5
Форумчанин
 
Регистрация: 09.05.2017
Сообщений: 735
По умолчанию

Спасибо за ответы, но вот только я не понял почему здесь число неотрицательное:
Цитата:
Сообщение от 7in Посмотреть сообщение
• CWD (AX->DX:AX): если старший бит AX (AX and 8000h) = 0 (т.е. число неотрицательное)
- ведь 0x8000 - это -32768.
Напишу программу на C++ и Asm для AVR. Черчение: sergeisky@yahoo.com.
Cuprum5 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
(С++) Схема неравенств Uefa Помощь студентам 1 14.06.2015 10:15
Система неравенств Vitalyas Общие вопросы C/C++ 2 14.03.2015 13:47
Построение графика системы неравенств Tatiana27 Помощь студентам 0 23.05.2012 22:39
Решение уравнений и неравенств annochka111 Помощь студентам 0 03.01.2010 19:29