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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 12.07.2009, 16:24   #1
Sirega
Пользователь
 
Регистрация: 23.11.2008
Сообщений: 30
По умолчанию Асэмблер

Помогите пожалуйста исправить ошибку.
Задание реализовать решение примера. Выдает ошибку о перевыполнении деления. Есть подозрения, что это происходит при делении (C/B)
Код:
page  80,120     

sseg     segment  stack 'stack'                            
           db 128 dup(?)                           
sseg     ends                                              

dseg     segment 'data'                       
   text1   db    'Program started',13,10,'$'  
   text2   db    '(d*d+a)/(d*d+b)-c/b-20 = $'              
   A       db    14h                       
   B       db    0FEh                        
   C       db    02Dh                         
   D       db    0EEh                                
   RESS     db    ?
   PROM1   dw    ?                          
   PROM2   dw    ?
   PROM3   dw    ?
dseg     ends                                      

cseg     segment 'code'                                  
            assume  cs:cseg, ds:dseg, ss:sseg    
                            
  start proc far                              
          mov   ax, dseg                      
          mov   ds, ax                        
     m1:  lea   dx, text1         
                                  
          call  WrStr          
          mov   dx, offset text2 
                                  
          call  WrStr          

     m2:     mov al, D
	imul byte ptr D       
        mov PROM1,ax   
	mov al , B
        cbw
	add PROM1, ax
	mov al, D
	mov al , D
	imul byte ptr D       
        mov PROM2,ax
        mov al, A
        cbw   
	add ax, PROM2
        div word ptr PROM1
	mov PROM3 , ax
	mov al , C
	idiv byte ptr B
        cbw
        sub PROM3, ax
        mov ax, PROM3 
	sub ax, 14 
	mov RESS , al
       m3:   mov   dl, al
                add   dl, 30h
                mov   ah, 02h
                 int   21h
       m4:   mov   ah, 4Ch
                 int   21h
          
  start  endp                       

  WrStr  proc near                             
             mov   ah,09h                    
             int   21h                       
             ret                             
  WrStr  endp                             

cseg     ends                                  
             end   start


Заранее спасибо!)
Sirega вне форума Ответить с цитированием
Старый 12.07.2009, 18:12   #2
Goodwin98
equ asm
Участник клуба
 
Аватар для Goodwin98
 
Регистрация: 02.05.2009
Сообщений: 1,605
По умолчанию

Я бы вам посоветовал, перед командой деления выполнять xor dx,dx или cwd. Должно помочь.
Какой вопрос - такой ответ. Не забываем пользоваться поиском, гуглом.
Помощь в выполнении работ по ассемблеру ICQ:2725322O4
Goodwin98 вне форума Ответить с цитированием
Старый 12.07.2009, 20:24   #3
Sirega
Пользователь
 
Регистрация: 23.11.2008
Сообщений: 30
По умолчанию

Заменил
Код:
  mov al , C
	idiv byte ptr B
             cbw
             sub PROM3, ax
на
Код:
mov al , C
             cbw
	idiv word ptr B
             sub PROM3, ax
Ответ получилс 'r' хотя должно получиться 3(

Последний раз редактировалось Stilet; 13.07.2009 в 10:01.
Sirega вне форума Ответить с цитированием
Старый 12.07.2009, 20:59   #4
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Вообще говоря (d*d+a) меньше чем (d*d+b), так что в результате деления будет ноль, так же как и c/b, отсюда общий результат -20...

Код:
   sub ax, 14 ; Здесь должно быть 14h
   mov RESS , al
netrino вне форума Ответить с цитированием
Старый 12.07.2009, 21:05   #5
Sirega
Пользователь
 
Регистрация: 23.11.2008
Сообщений: 30
По умолчанию

нет. Там 1 дробь равно 1 и остаток(16),с/b равно 22.5 и минус 20.

просто b и в отрецательные числа

Последний раз редактировалось Stilet; 13.07.2009 в 10:01.
Sirega вне форума Ответить с цитированием
Старый 12.07.2009, 21:32   #6
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

А, за это извиняюсь - не вник

Вот, только на FASM, но суть одна:
Код:

format MZ
entry codesg:start
heap 0
stack 100h

macro print p {
   mov ah,09h
   mov dx,p
   int 21h
}

segment datasg
   text1 db "Program started",13,10,'$'
   text2 db "(d*d+a)/(d*d+b)-c/b-20 = $"
   A     db 14h
   B     db 0FEh
   C     db 02Dh
   D     db 0EEh
   RESS  db ?
   PROM1 dw ?
   PROM2 dw ?

segment codesg
start:
   mov ax,datasg
   mov ds,ax
   print text1
   print text2

; (d*d+a)
   mov    ah,0
   mov    al,[D]
   imul   [D]
   mov    [PROM1],ax
   mov    bh,0
   mov    bl,[A]
   add    [PROM1],bx

; (d*d+b)
   mov    [PROM2],ax  ; ax уже содержит d*d
   mov    bh,0FFh       ; Внимание: раз B знаковое, то верхний байт должен содержать еденицы
   mov    bl,[B]
   add    [PROM2],bx

; (d*d+a)/(d*d+b)
   xor    dx,dx
   mov    ax,[PROM1]
   div    [PROM2]
   mov    [PROM1],ax

; (c/b)
   xor    dx,dx
   mov    ah,0
   mov    al,[C]
   idiv   [B]
   mov    [PROM2],ax

; (d*d+a)/(d*d+b) - c/b - 20
   mov    ax,[PROM1]
   sub    ax,[PROM2]
   sub    ax,20

   mov    [RESS],al

   mov    dl,al
   add    dl,30h
   mov    ah,02h
   int    21h

   xor    ax,ax
   int    16h

   mov    ax,4C00h
   int    21h

Последний раз редактировалось netrino; 12.07.2009 в 21:41.
netrino вне форума Ответить с цитированием
Старый 12.07.2009, 21:46   #7
Sirega
Пользователь
 
Регистрация: 23.11.2008
Сообщений: 30
По умолчанию

Большое спасибо))) Только мне нужно сделать тем методом( На дєбаге проверял после первой прокрутке все нормально, а на 2 ошибка на делении С на Б. может просто нельзя делить бай байт, хотя я и слово на байт делил всеравно не получается=(
Sirega вне форума Ответить с цитированием
Старый 12.07.2009, 21:53   #8
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Цитата:
Сообщение от Goodwin98 Посмотреть сообщение
Я бы вам посоветовал, перед командой деления выполнять xor dx,dx
Верное замечание, перед каждым div, следует добавить xor dx,dx или mov dx,0.

Цитата:
Заменил
mov al , C
idiv byte ptr B
cbw
sub PROM3, ax
на mov al , C
cbw
idiv word ptr B
sub PROM3, ax
Ответ получилс 'r' хотя должно получиться 3(
Этого не стоит делать) Вы пытаетесь взять 2 байта из однобайтовой переменной B.
netrino вне форума Ответить с цитированием
Старый 12.07.2009, 22:17   #9
Goodwin98
equ asm
Участник клуба
 
Аватар для Goodwin98
 
Регистрация: 02.05.2009
Сообщений: 1,605
По умолчанию

Подкорректирую сам себя. При делении на слово, делиться DX:AX, а при делении на байт делиться весь AX. Т.е. если делится idiv bl, то перед этим надо очищать ah, а если idiv bx, то очищать уже надо dx.

Цитата:
"div" производит беззнаковое деление аккумулятора на операнд. Делимое (аккумулятор) размером в два раза больше делителя (операнда), частное и остаток такого же размера , как и делитель. Если делитель - байт, делимое берется из регистра AX, частное сохраняется в AL, а остаток - в AH. Если делитель - слово, верхняя половина делимого берется из DX, а нижняя - из AX, частное сохраняется в AX, а остаток - в DX.
"idiv" выполняет знаковое деление аккумулятора на операнд. Инструкция использует те же регистры, что и "div", правила для операнда тоже такие же.
Код netrino, конечно работает, но заносить самому в bh 0 или 0ffh это не есть гуд. Наверно лучше просто переменные PROM1 и PROM2 сделать по байту.
Цитата:
Заменил
mov al , C
idiv byte ptr B
cbw
sub PROM3, ax
на mov al , C
cbw
idiv word ptr B
sub PROM3, ax
По правильному
Код:
mov al , C
cbw
idiv byte ptr B
sub PROM3, al
Какой вопрос - такой ответ. Не забываем пользоваться поиском, гуглом.
Помощь в выполнении работ по ассемблеру ICQ:2725322O4

Последний раз редактировалось Goodwin98; 12.07.2009 в 22:26.
Goodwin98 вне форума Ответить с цитированием
Старый 12.07.2009, 22:36   #10
Sirega
Пользователь
 
Регистрация: 23.11.2008
Сообщений: 30
По умолчанию

когда используем в конце al пишет ошибку. Мы делим слово на байт и по идее должно получится слово. Или я ошибаюсь?
Sirega вне форума Ответить с цитированием
Ответ


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