1718 / 567 / 187
Регистрация: 12.03.2016
Сообщений: 2,169
1

Неправильный вывод из программы

03.11.2016, 06:32. Показов 1522. Ответов 16
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем доброго утра. Столкнулся с проблемой которую никак не могу понять.
Имеется код программы

Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
.model small
.386
.stack 100h
 
.code    
        start:          
            mov ax,127
            mov bx,35
 
            qqq:
            sub ax,bx
            inc cx
            cmp ax,bx
            ja qqq
 
 
            xor ax,ax
        mov ax,cx
    
        call vyv
        
        mov ax,4c00h
        int 21h
 
    vyv proc
    
    xor     bx,bx
    xor     cx, cx
    mov     bx, 10 
oi2:
    xor     dx,dx
    div     bx
    push    dx
    inc     cx
    test    ax, ax
    jnz     oi2
    mov     ah, 02h
oi3:
    pop     dx
 
    add     dl, '0'
    int     21h
    loop    oi3
   ret
   vyv endp
  end start
программа компилируется, но при выполнении выводит 258, а не 3 как должно.
Хотя программа

Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
.model small
.386
.stack 100h
 
.code    
        start:          
            
            mov cx,3
        mov ax,cx
    
        call vyv
        
        mov ax,4c00h
        int 21h
 
    vyv proc
                
    xor     bx,bx
    xor     cx, cx
    mov     bx, 10 
oi2:
    xor     dx,dx
    div     bx
    push    dx
    inc     cx
    test    ax, ax
    jnz     oi2
    mov     ah, 02h
oi3:
    pop     dx
 
    add     dl, '0'
    int     21h
    loop    oi3
   ret
   vyv endp
  end start
выводит 3 как положено.
Излазил обе программы в отладчике, но так и не смог разобраться.
Что то упускаю, но что не могу понять. Подскажите пожалуйста в чем проблема
и как ее исправить. Заранее всем спасибо.
1
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
03.11.2016, 06:32
Ответы с готовыми решениями:

Неправильный результат выполнения программы
Здравствуйте, при выполнении задания столкнулся с проблемой и не могу найти ошибку. Задание во...

Неправильный вывод строки на ассемблере
Программа на ассемблере должна выводить на экран имя и фамилию, введенные ранее с клавиатуры....

DOS неправильный вывод строки
Разбирая программу отслеживаю переходы по условию. Ветви которые в данный момент не интересуют...

Неправильный код программы на TASM
Здравствуйте. Вот дан текст программы на DEBUG: -a Есть и код на TASM этой программы, но он...

16
644 / 148 / 31
Регистрация: 11.02.2013
Сообщений: 277
03.11.2016, 08:16 2
Цитата Сообщение от мановар Посмотреть сообщение
Излазил обе программы в отладчике, но так и не смог разобраться.
Что то упускаю, но что не могу понять.
Плохо излаэил! Но понять немудрено.
Цитата Сообщение от мановар Посмотреть сообщение
программа компилируется, но при выполнении выводит 258, а не 3 как должно.Подскажите пожалуйста в чем проблема и как ее исправить. Заранее всем спасибо.
Потому, что в первом примере, надо было, перед циклом, очистить регистр cx от мусора (мусор, твоё число 258).
Во втором примере, в регистр cx, значение передаётся напрямую и затирает мусор, числом 3.
1
1718 / 567 / 187
Регистрация: 12.03.2016
Сообщений: 2,169
03.11.2016, 08:23  [ТС] 3
XiloManX, большое спасибо помогло. Просто почему то в отладчике этого мусора не видно.
1
644 / 148 / 31
Регистрация: 11.02.2013
Сообщений: 277
03.11.2016, 08:54 4
Цитата Сообщение от мановар Посмотреть сообщение
Просто почему то в отладчике этого мусора не видно.
Не знаю точно, но наверно, отладчик перед отладкой, очищает регистры, поэтому и не видно. Просто имей ввиду, что: регистры, буферы м массивы, надо очищать заранее, перед использованием (если требуется), потому что там, почти всегда содержится мусор, который может вызывать проблемы.
1
3406 / 1825 / 489
Регистрация: 28.02.2015
Сообщений: 3,696
03.11.2016, 11:27 5
Вы где только можно используете xor r,r - mov r,x, но только не вначале с регистром СХ.
1
1718 / 567 / 187
Регистрация: 12.03.2016
Сообщений: 2,169
03.11.2016, 12:03  [ТС] 6
Constantin Cat, как исправить я уже понял и исправил. Неясным для меня остается одно, почему в отладчике не видно мусора. В подпрограмму передается AX=3, проходит один цикл для вывода как и положено и т.д. , т.е. регистры общего назначения в обоих программах (при выполнении подпрограммы) абсолютно идентичны, но результат при выполнении прерывания на вывод символа разный.
1
Эксперт Hardware
Эксперт Hardware
6092 / 2337 / 390
Регистрация: 29.07.2014
Сообщений: 3,102
Записей в блоге: 4
03.11.2016, 14:19 7
Лучший ответ Сообщение было отмечено Manowar как решение

Решение

мановар, начальное значение регистров привязано к типу исполняемого файла.
Просмотреть их можно в отладчике 'AVPUtil' (TD здесь мухлюет):
Код
; Файл типа COM ---------
AX 0000  CX 00FF  DS:SI 2075:0100  CS:IP 2075:0100  BP 0000  ODITSZAPC
BX 0000  DX 2075  ES:DI 2075:FFFE  SS:SP 2075:FFFE  FL 7202  001000000

; Файл типа EXE ---------
AX 0000  CX 00FF  DS:SI 2075:0200  CS:IP 2065:0200  BP 0000  ODITSZAPC
BX 0000  DX 2075  ES:DI 2075:0200  SS:SP 2C0D:0200  FL 7202  001000000
Здесь видно, что все флаги сброшены, кроме разрешения прерываний(IF).
В обоих случаях счётчик(СХ) выставляется в FFh, а содержимое регистра(АХ) привязывается к параметрам ком.строки. Если указан неверный параметр, то AХ=FFFFh, иначе - нуль. Все эти действия выполняет функция(4Bh) DOS - загрузить и выполнить программу. Почитай про неё..
4
3406 / 1825 / 489
Регистрация: 28.02.2015
Сообщений: 3,696
03.11.2016, 14:51 8
мановар, в начале программы поставьте pusha, и после выводите РОНы на экран(8 шт всего),Вы убедитесь, что R71MT, таки прав.
1
1718 / 567 / 187
Регистрация: 12.03.2016
Сообщений: 2,169
03.11.2016, 15:08  [ТС] 9
Constantin Cat, а я и не спорю. Этот отладчик все четко и ясно показал, еще малец поэксперементирую.

Добавлено через 9 минут
R71MT, спасибо огромное, не знал об этом отладчике. Использовал еще пару, но результат был как у TD, а ведь спинным мозгом чувствовал, что где то здесь собака порылась. Еще раз спасибо.
2
Эксперт Hardware
Эксперт Hardware
6092 / 2337 / 390
Регистрация: 29.07.2014
Сообщений: 3,102
Записей в блоге: 4
16.06.2018, 04:39 10
Лучший ответ Сообщение было отмечено Mikl___ как решение

Решение

Цитата Сообщение от Manowar Посмотреть сообщение
не знал об этом отладчике.
Санёк. эт авера инструмент - он оттянет любого, тд даже рядом не стоял

Добавлено через 11 минут
крис пипец эксперемнтировал, а мы ленимся
2
Manowar
16.06.2018, 11:21  [ТС]
  #11

Не по теме:

Цитата Сообщение от R71MT Посмотреть сообщение
а мы ленимся
Мы не ленимся, нам некогда, делом заняты - водку пьянствуем и безобразия нарушаем. :drink:

0
Эксперт Hardware
Эксперт Hardware
6092 / 2337 / 390
Регистрация: 29.07.2014
Сообщений: 3,102
Записей в блоге: 4
16.06.2018, 12:23 12
Цитата Сообщение от R71MT Посмотреть сообщение
крис пипец эксперемнтировал,
..это не просто слова.
сколько время отнимает практика? А он не ленился...
Практик был ещё тот - скланяю голову перед ним.. Крутой чел был..
1
Asm/C++/Delphi/Py/PHP/VBA
6514 / 1962 / 225
Регистрация: 14.12.2014
Сообщений: 4,109
Записей в блоге: 12
17.06.2018, 19:13 13
Цитата Сообщение от R71MT Посмотреть сообщение
Просмотреть их можно в отладчике 'AVPUtil' (TD здесь мухлюет)
AVPUtil тоже мухлюет, судя по всему
Ибо BP при старте не равен 0. Старший байт = 9, младший разный в разных DOS'ах.

Подробнее: Значения регистров при запуске программы (DOS COM)

Вкратце:
  • BX=AX (зависят от командной строки, старшие и младшие байты могут быть либо 0, либо -1),
  • CX=0FFh,
  • DX=DS=ES=PSP (в .COM =CS=SS),
  • SI=IP,
  • DI=SP,
  • BP=9xxh (обычно 91Ch, 912h, 91Eh),
  • флаги=7202h (или 0202h),
  • FS и GS – значения разные в разных DOS'ах,
  • старшие слова в E-регистрах могут быть ненулевыми!

Добавлено через 1 минуту
В .COM-программах на вершине стека лежит 0 (поэтому срабатывает выход по ret, но только в .COM).

Однако из этого всего документировано, насколько я знаю, только AX, DS=ES=PSP (а в .COM ещё и =CS=SS) и 0 в стеке.
0
Эксперт Hardware
Эксперт Hardware
6092 / 2337 / 390
Регистрация: 29.07.2014
Сообщений: 3,102
Записей в блоге: 4
17.06.2018, 19:58 14
Цитата Сообщение от Jin X Посмотреть сообщение
Ибо BP при старте не равен 0
...на каком проце проверял? у меня на пентиум(д) нуль при ребуте
0
Asm/C++/Delphi/Py/PHP/VBA
6514 / 1962 / 225
Регистрация: 14.12.2014
Сообщений: 4,109
Записей в блоге: 12
17.06.2018, 23:14 15
R71MT, причём тут проц и ребут?
Мы же говорим про регистры при старте проги, которые выставляет DOS, а не проц...
0
Эксперт Hardware
Эксперт Hardware
6092 / 2337 / 390
Регистрация: 29.07.2014
Сообщений: 3,102
Записей в блоге: 4
17.06.2018, 23:28 16
Женя я попутал..
а знаешь про амдшную дырку.. если запишешь в MSR-регистр константу - рухнет.
0
Asm/C++/Delphi/Py/PHP/VBA
6514 / 1962 / 225
Регистрация: 14.12.2014
Сообщений: 4,109
Записей в блоге: 12
18.06.2018, 08:19 17
R71MT, нет, расскажи
0
18.06.2018, 08:19
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.06.2018, 08:19
Помогаю со студенческими работами здесь

Неправильный вывод программы
Ребят,что не так? Ничего не выводит #include <stdio.h> #include <stdlib.h> main(){...

Неправильный парсинг строки и неправильный её вывод
Добрый день! Столкнулся с непонятным поведением парсера: На вход подается вот такая строка: ...

Неправильный вывод
Я как неделю начал изучать php и решил написать простенькую программку и у меня возникла такая...

Неправильный вывод
Добрый день. Изучаю MySQL и PHP и вот столкнулся с такой проблемой. Имеется код, в котором...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru