Форум программистов, компьютерный форум, киберфорум
Assembler для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
0 / 0 / 2
Регистрация: 02.01.2014
Сообщений: 240
1

Как вывести результат исполнения этой программы?

14.04.2014, 21:39. Просмотров 1433. Ответов 16
Метки нет (Все метки)

Написал программу, она работает проверял в turbo debbuger. Но не могу понять как вывести результат исполнения этой программы. Помогите пожалуйста.
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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
.stack 100h
LOCALS @@
;          (3*a-5)/b, if a<b
;  y=    -4           , if a=b 
;          (a^3+b)/a, if a>b
Datas segment
a dw 5
b dw 10
c dw 3
y dw ?
mesg1   db  'Dilennia na 0 $'
mesg2   db  'Perepovnennia pry 16-rozrydnomu mnoshenni $'
 Datas ends
Codes segment
  Assume cs:Codes, ds : Datas 
    First:
   mov ax,Datas
   mov ds,ax
   mov ax,a
   mov bx,b
   cmp ax,bx
   jA @@2
   jB @@1
 
  mov ax,-4
  mov dx,0FFFFh
  jmp short @@Exit
 
@@1:
  cmp bx,0
  JE @@ERROR
  mul c 
  sub ax,5
  CWD
  IDIV b
  ;mov y,ax  
  jmp short @@Exit
 
@@2:
  cmp bx,0
  JE @@ERROR
  mul a
  Jo @@ERRORm
  mul a
  adc dx,0FFFFh
  add ax,bx
  div a
  ;mov y,ax
  jmp short @@Exit
 
@@ERROR:
mov ah, 9
mov dx, offset mesg1
int 21h
mov ax,4c00h
int 21h
 ret
 
@@ERRORm:
mov ah, 9
mov dx, offset mesg2
int 21h
mov ax,4c00h
int 21h
 
  ret
 
@@Exit:
;mov y,ax
mov ah, 9
mov dx, ax 
int 21h
mov ax,4c00h
int 21h
  ret
 
Codes ends
end First
Насколько я понимаю ошибка в @@Exit. Я пытался выводить черезе переменную (у) тогда пишет 2 символа из муссора и Деление на 0, тоесть 1 переменнуя mesg, а когда выводжу через регистр ax- просто муссор.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.04.2014, 21:39
Ответы с готовыми решениями:

Вывести результат работы программы на экран
задание простое: подсчитать кол-во отрицательных чисел в массиве в принципе, код программы есть:...

Нужно вывести результат виполнения программы на екран.
Надо чтобы результат программы, что описана ниже, выводился еще на экран. .model small .386...

Как вывести результат программы в консоль
Привет, недавно начал разбирать в ассемблере TASM. Написал программу, но не могу придумать, как...

Как вывести результат выполнения программы на экран?
.386 .model flat, stdcall option casemap :none include \masm32\include\windows.inc ...

16
649 / 336 / 37
Регистрация: 04.04.2012
Сообщений: 887
14.04.2014, 22:21 2
Прикрепленная тема: Ввод и вывод чисел в различных системах счисления
0
0 / 0 / 2
Регистрация: 02.01.2014
Сообщений: 240
20.04.2014, 14:23  [ТС] 3
Попробовал все методы, понял что программа выводит значения в 16-ричной системе, а как перевести в 10. Те методы не помогают, помогите пожалуйста
0
649 / 336 / 37
Регистрация: 04.04.2012
Сообщений: 887
21.04.2014, 00:14 4
Из прикрепленной темы:
Вывод целого знакового, либо беззнакового числа.
Число для вывода должно находиться в ax.
Assembler
1
2
3
    xor     cx, cx
    mov     bx, 10 ; основание сс. 10 для десятеричной и т.п.
oi2:
основание сс. 10 для десятеричной и т.п.
0
0 / 0 / 2
Регистрация: 02.01.2014
Сообщений: 240
21.04.2014, 13:32  [ТС] 5
Написал вот так вот.
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
...
@@Exit:
;xor     cx, cx
;mov     bx, 10 
mov ah, 9
xor     cx, cx
mov     bx, 10 
mov dx, offset y
int 21h
mov ax,4c00h
int 21h
  ret
...
Оно выводит Dilennia na 0
0
0 / 0 / 2
Регистрация: 02.01.2014
Сообщений: 240
21.04.2014, 13:34  [ТС] 6
Вот скрин
0
Миниатюры
Как вывести результат исполнения этой программы?  
0 / 0 / 2
Регистрация: 02.01.2014
Сообщений: 240
21.04.2014, 13:34  [ТС] 7
Помогите с этим выводом, а то я уже незнаю что делать(. Уже думалка поламалась(.
0
649 / 336 / 37
Регистрация: 04.04.2012
Сообщений: 887
21.04.2014, 14:08 8
Лучший ответ Сообщение было отмечено Taatshi как решение

Решение

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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
.stack 100h
LOCALS @@
;          (3*a-5)/b, if a<b
;  y=    -4           , if a=b 
;          (a^3+b)/a, if a>b
Datas segment
a dw 5
b dw 10
c dw 3
y dw ?
mesg1   db  'Dilennia na 0 $'
mesg2   db  'Perepovnennia pry 16-rozrydnomu mnoshenni $'
 Datas ends
Codes segment
  Assume cs:Codes, ds : Datas 
    First:
   mov ax,Datas
   mov ds,ax
   mov ax,a
   mov bx,b
   cmp ax,bx
   jA @@2
   jB @@1
 
  mov ax,-4
  mov dx,0FFFFh
  jmp short @@Exit
 
@@1:
  cmp bx,0
  JE @@ERROR
  mul c 
  sub ax,5
  CWD
  IDIV b
  ;mov y,ax  
  jmp short @@Exit
 
@@2:
  cmp bx,0
  JE @@ERROR
  mul a
  Jo @@ERRORm
  mul a
  adc dx,0FFFFh
  add ax,bx
  div a
  ;mov y,ax
  jmp short @@Exit
 
@@ERROR:
mov ah, 9
mov dx, offset mesg1
int 21h
mov ax,4c00h
int 21h
; ret
 
@@ERRORm:
mov ah, 9
mov dx, offset mesg2
int 21h
mov ax,4c00h
int 21h
 
;  ret
 
@@Exit:
;; если число знаковое, то необходимо расскоментировать следующие строки
;; Проверяем число на знак.
;   test    ax, ax
;   jns     oi1
;
;; Если оно отрицательное, выведем минус и оставим его модуль.
;   mov  cx, ax
;   mov     ah, 02h
;   mov     dl, '-'
;   int     21h
;   mov  ax, cx
;   neg     ax
;; Количество цифр будем держать в CX.
;oi1:  
    xor     cx, cx
    mov     bx, 10 ; основание сс. 10 для десятеричной и т.п.
oi2:
    xor     dx,dx
    div     bx
; Делим число на основание сс. В остатке получается последняя цифра.
; Сразу выводить её нельзя, поэтому сохраним её в стэке.
    push    dx
    inc     cx
; А с частным повторяем то же самое, отделяя от него очередную
; цифру справа, пока не останется ноль, что значит, что дальше
; слева только нули.
    test    ax, ax
    jnz     oi2
; Теперь приступим к выводу.
    mov     ah, 02h
oi3:
    pop     dx
; Извлекаем очередную цифру, переводим её в символ и выводим.
;; раскоментировать если основание сс > 10, т.е. для вывода требуются буквы
;   cmp     dl,9
;   jbe     oi4
;   add     dl,7
;oi4:
    add     dl, '0'
    int     21h
; Повторим ровно столько раз, сколько цифр насчитали.
    loop    oi3
;mov y,ax
;mov ah, 9
;mov dx, ax 
;int 21h
mov ax,4c00h
int 21h
;  ret
 
Codes ends
end First
1
0 / 0 / 2
Регистрация: 02.01.2014
Сообщений: 240
26.04.2014, 22:17  [ТС] 9
Спасибо, минус она выводит, целые числа тоже, а вот знаковые нехочет. Выводит символ похожый на 0, я точно знаю что он со строчки add dl, '0'. Извините что гружу, но нужна ваша помощь.
0
649 / 336 / 37
Регистрация: 04.04.2012
Сообщений: 887
27.04.2014, 00:24 10
Вывод работает правильно
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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
;DOS, TASM, COM-файл
;tasm.exe /m filename.asm
;tlink.exe /t /x filename.obj
;
.model tiny
.code
org 100h
START:
 
    mov ax,-100
 
;; если число знаковое, то необходимо расскоментировать следующие строки
;; Проверяем число на знак.
   test    ax, ax
   jns     oi1
;
;; Если оно отрицательное, выведем минус и оставим его модуль.
   mov  cx, ax
   mov     ah, 02h
   mov     dl, '-'
   int     21h
   mov  ax, cx
   neg     ax
;; Количество цифр будем держать в CX.
oi1:  
    xor     cx, cx
    mov     bx, 10 ; основание сс. 10 для десятеричной и т.п.
oi2:
    xor     dx,dx
    div     bx
; Делим число на основание сс. В остатке получается последняя цифра.
; Сразу выводить её нельзя, поэтому сохраним её в стэке.
    push    dx
    inc     cx
; А с частным повторяем то же самое, отделяя от него очередную
; цифру справа, пока не останется ноль, что значит, что дальше
; слева только нули.
    test    ax, ax
    jnz     oi2
; Теперь приступим к выводу.
    mov     ah, 02h
oi3:
    pop     dx
; Извлекаем очередную цифру, переводим её в символ и выводим.
;; раскоментировать если основание сс > 10, т.е. для вывода требуются буквы
;   cmp     dl,9
;   jbe     oi4
;   add     dl,7
;oi4:
    add     dl, '0'
    int     21h
; Повторим ровно столько раз, сколько цифр насчитали.
    loop    oi3
 
    xor ax,ax
    int 16h
    
    ret
 
    end start
0
0 / 0 / 2
Регистрация: 02.01.2014
Сообщений: 240
27.04.2014, 17:15  [ТС] 11
ааааа

Добавлено через 1 минуту
Оно отрицательное и целое положительное выводит. А не целые числа не выведет.
0
649 / 336 / 37
Регистрация: 04.04.2012
Сообщений: 887
27.04.2014, 20:55 12
Ну так копайте сами! Гугл есть. Потратьте свое время для решения СВОЕЙ задачи.
1
0 / 0 / 2
Регистрация: 02.01.2014
Сообщений: 240
28.04.2014, 21:35  [ТС] 13
Чего-то Ваш гугл не говорит ничего нормального

Добавлено через 19 секунд
Пишу я сюда потому что уже и так всрал 2 ночи на это

Добавлено через 2 часа 47 минут
Вот дописал прожку, она ставит "." и должна дописывать часть числа после точки, но она всегда пишет 10. Что-то я делаю не так, скажите что.
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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
.model large, C
.stack 100h
LOCALS @@
;          (3*a-5)/b, if a<b
;  y=    -4           , if a=b 
;          (a^3+b)/a, if a>b
Datas segment
a dw 5
b dw 10
c dw 3
y dw ?
mesg1   db  'Dilennia na 0 $'
mesg2   db  'Perepovnennia pry 16-rozrydnomu mnoshenni $'
 Datas ends
Codes segment
  Assume cs:Codes, ds : Datas 
    First:
   mov ax,Datas
   mov ds,ax
   mov ax,a
   mov bx,b
   cmp ax,bx
   jA @@2
   jB @@1
 
  mov ax,0
  sub ax,4
  jmp short @@Exit
 
@@1:
  cmp bx,0
  JE @@ERROR
  mul c 
  sub ax,5
  CWD
  IDIV b
  mov bx,dx  
  jmp short @@Exit
 
@@2:
  cmp bx,0
  JE @@ERROR
  mul a
  Jo @@ERRORm
  mul a
  adc dx,0FFFFh
  add ax,bx
  div a
  mov bx,dx
  jmp short @@Exit
 
@@ERROR:
mov ah, 9
mov dx, offset mesg1
int 21h
mov ax,4c00h
int 21h
; ret
 
@@ERRORm:
mov ah, 9
mov dx, offset mesg2
int 21h
mov ax,4c00h
int 21h
 
;  ret
 
@@Exit:
;; если число знаковое, то необходимо расскоментировать следующие строки
;; Проверяем число на знак.
   test    ax, ax
   jns     oi1
;
;; Если оно отрицательное, выведем минус и оставим его модуль.
   mov  cx, ax
   mov     ah, 02h
   mov     dl, '-'
   int     21h
   mov  ax, cx
   neg     ax
;; Количество цифр будем держать в CX.
oi1:  
    xor     cx, cx
    mov     bx, 10 ; основание сс. 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 
 
   oi4:
   mov     ah, 02h
   mov     dl, '.'
   int     21h
   mov ax,bx 
  oi7:  
    xor     cx, cx
    mov     bx, 10 ; основание сс. 10 для десятеричной и т.п.
oi6:
    ;xor     dx,dx
    div     bx
; Делим число на основание сс. В остатке получается последняя цифра.
; Сразу выводить её нельзя, поэтому сохраним её в стэке.
    push    dx
    inc     cx
; А с частным повторяем то же самое, отделяя от него очередную
; цифру справа, пока не останется ноль, что значит, что дальше
; слева только нули.
    test    ax, ax ; Пока не ноль преобразуем  в десятичный вид
    jnz     oi6
; Теперь приступим к выводу.
    mov     ah, 02h
    
oi5:
    pop     dx
    add     dl, '0' ; преобразуем число в символьный вид  
    int     21h
; Повторим ровно столько раз, сколько цифр насчитали.
    loop    oi5
   mov ax,4c00h
int 21h
 
Codes ends
end First
Добавлено через 3 минуты
Насколько я понимаю остача всегда остаеться в dx. Потому dx я заношу в bx, а в выводе его заношу в ax и делаю все то, как и в целых числах. Вродебы всё логично, но почему не идёт я не знаю помогите.
0
193 / 189 / 18
Регистрация: 06.10.2013
Сообщений: 358
28.04.2014, 21:49 14
Mansu, вот здесь код, выводящий результат деления с дробной частью.
1
0 / 0 / 2
Регистрация: 02.01.2014
Сообщений: 240
28.04.2014, 22:00  [ТС] 15
Спасибо, помогло)
0
649 / 336 / 37
Регистрация: 04.04.2012
Сообщений: 887
28.04.2014, 22:02 16
Mansu,
вопрос решен?
0
0 / 0 / 2
Регистрация: 02.01.2014
Сообщений: 240
28.04.2014, 22:42  [ТС] 17
Хотя, в той программе есть ошибки.

Добавлено через 16 секунд
Нет.

Добавлено через 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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
.model large, C
.stack 100h
LOCALS @@
;          (3*a-5)/b, if a<b
;  y=    -4           , if a=b 
;          (a^3+b)/a, if a>b
Datas segment
a dw 5
b dw 10
c dw 3
y dw ?
mesg1   db  'Dilennia na 0 $'
mesg2   db  'Perepovnennia pry 16-rozrydnomu mnoshenni $'
 Datas ends
Codes segment
  Assume cs:Codes, ds : Datas 
    First:
   mov ax,Datas
   mov ds,ax
   mov ax,a
   mov bx,b
   cmp ax,bx
   jA @@2
   jB @@1
 
  mov ax,0
  sub ax,4
  jmp short @@Exit
 
@@1:
  cmp bx,0
  JE @@ERROR
  mul c 
  sub ax,5
  CWD
  IDIV b
  mov bx,dx  
  jmp short @@Exit
 
@@2:
  cmp bx,0
  JE @@ERROR
  mul a
  Jo @@ERRORm
  mul a
  adc dx,0FFFFh
  add ax,bx
  div a
  mov bx,dx
  jmp short @@Exit
 
@@ERROR:
mov ah, 9
mov dx, offset mesg1
int 21h
mov ax,4c00h
int 21h
; ret
 
@@ERRORm:
mov ah, 9
mov dx, offset mesg2
int 21h
mov ax,4c00h
int 21h
 
;  ret
 
@@Exit:
;; если число знаковое, то необходимо расскоментировать следующие строки
;; Проверяем число на знак.
   test    ax, ax
   jns     oi1
;
;; Если оно отрицательное, выведем минус и оставим его модуль.
   mov  cx, ax
   mov     ah, 02h
   mov     dl, '-'
   int     21h
   mov  ax, cx
   neg     ax
;; Количество цифр будем держать в CX.
oi1:  
    xor     cx, cx
    mov     bx, 10 ; основание сс. 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 
 
   oi4:
   mov     ah, 02h
   mov     dl, '.'
   int     21h
   mov ax,bx 
  
mov cx,20      ; количество знаков после запятой
stosw
 
;@@b:
mov ax,dx
mul bp
xor dx,dx
div bx
or ax,0a30h
stosw
test dx,dx
;je exit
;loop @b
 
;exit:
xor ax,ax
int 16h
ret   
mov ax,4c00h
int 21h
 
Codes ends
end First
теперь выводит х.

Добавлено через 1 минуту
Скажите, точно остаток сохраняеться в dx. И можно ли так его перенсоить в exit, как это делаю я.

Добавлено через 2 минуты
Там еще надо закоментить эту часть
;@@b:
;mov ax,dx

Добавлено через 3 минуты
И еще добавить mov bp,10

Добавлено через 13 минут
Наверное эту программу надо полностью переделать, а то когда я савлю числа 5,3, то она зацикливаеться.

Добавлено через 12 минут
Хотя нет, ошибка только в том что я дописал.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.04.2014, 22:42

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

В каком регистре будет находиться результат исполнения оператора add ax, bx
в каком регистре будет находиться результат исполнения оператора add ax, bx

Как результат работы программы вывести на экран
Помогите пожалуйста дополнить две програмки(смысл первой програмки в том что даны два массива А и В...

[Задача] Объясните результат исполнения программы
// Файл t1.cc #include &lt;iostream&gt; class C { int x; public: C() { x = 10; } ...

Подскажите как определить результат выполнения этой программы
Begin n:=30; a:=1; b;=1; for j:= 3 to n do begin b:=a+b; a:=b; ...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.