Форум программистов, компьютерный форум, киберфорум
Assembler для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/76: Рейтинг темы: голосов - 76, средняя оценка - 4.71
0 / 0 / 0
Регистрация: 13.06.2015
Сообщений: 23

Вывод числа в консоль из регистра АХ

23.05.2019, 03:49. Показов 14196. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
В программа реализован ввод чисел, некоторые арифметические действия с ними. Результат действий сохраняется в регистре АХ. Этот результат мне нужно вывести в десятичном виде в консоль
И я совсем запутался в каком виде оно там хранится, в двоичном или шестнадцатеричном. Мне нужно его перевести в десятичный и вывести?
Пробовал множество способов , ни один не получилось реализовать.
Пока что код в таком виде. Собственно в участке "output" нужно реализовать вывод числа в консоль, учитывая что число сидит в АХ после арифм. действий.
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
TITLE Laba_1
data segment  
    buffer db 80
    ;length db ?
    string db 80 dup (0)
    inputC db 10,13,'C= $'
    inputD db 10,13,'D= $'
    otvet db 10,13,'Otvet: '
    a dw 0032h
    b dw 0014h
    c dw ?
    d dw ?
 
data ends
code segment
    assume cs:code,ds:data
begin:
    mov ax,data
    mov ds,ax
    
    call vvodCD
    call calculate
    call output
 
vvodCD:
    mov ah,09h
    lea dx, inputC  
    int 21h
    mov ah,0ah
    xor di,di
    mov dx,offset buffer ; адрес буфера
    int 21h ; принимаем строку
    mov dl,0ah
    mov ah,02
    int 21h ;
    call read
    mov c, ax
    
    mov ah,09h
    lea dx, inputD  
    int 21h
    mov ah,0ah
    xor di,di
    mov dx,offset buffer ; адрес буфера
    int 21h ; принимаем строку
    mov dl,0ah
    mov ah,02
    int 21h ;
    call read
    mov d, ax
ret
calculate:
    mov ax, b
    sub ax, d
    add ax, a
    mul c
ret
output:
 
ret
read:   
    mov si,offset buffer+2 ; берем аддрес начала строки. Первые символы - инфа о строке.
    cmp byte ptr [si],"-" ; если первый символ минус
    jnz ii1
    mov di,1  ; устанавливаем флаг
    inc si    ; и пропускаем его
    ii1:
        xor ax,ax
        mov bx,10  ; основание сc для Горнера
    ii2:
        mov cl,[si] ; берем символ из буфера
        cmp cl,0dh  ; проверяем не последний ли он
        jz endin ; если последний , переходим на endin
        sub cl,'0' ; делаем из символа число 
        mul bx     ; умножаем на 10
        add ax,cx  ; прибавляем к остальным
        inc si     ; указатель на следующий символ, т.е берем след. символ
        jmp ii2     ; повторяем
 
; все символы из буфера обработаны число находится в ax
    endin:
        cmp di,1 ; если установлен флаг, то
        jnz exit
        neg ax   ; делаем число отрицательным. Переводим его в доп код
    exit:
        ret
    
    mov ax, 4c00h  
    int 21h         
code ends        
END begin
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
23.05.2019, 03:49
Ответы с готовыми решениями:

Наилучший алгоритм вывода числа на консоль (например из регистра)
У меня масса вариантов как сделать вывод числа на консоль, но я никак не могу определиться хотя бы с одним. Хотелось бы чтобы этот алгоритм...

Вывод числа на экран из регистра.
Доброго времени суток. Подскажите,пожалуйста,как можно число,записанное например в регистр ax в десятичном виде, вывести на экран консоли?

Вывод десятичного числа из регистра на экран
Трабла такая - после определенных операций (не суть важно каких) в регистре АL содержится число 62 в ДЕСЯТИЧНОМ формате. И вывести его на...

10
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8644 / 4479 / 1669
Регистрация: 01.02.2015
Сообщений: 13,883
Записей в блоге: 11
23.05.2019, 06:16
В закреплённой теме
Ввод и вывод чисел в различных системах счисления
0
0 / 0 / 0
Регистрация: 13.06.2015
Сообщений: 23
24.05.2019, 02:29  [ТС]
Возникла другая проблема. В работе используются большие числа, из за чего при выполнении арифметических операций возникает переполнении, и полученное число хранится в DX:AX. Это число мне нужно вывести в консоль. При попытке делить его на 10, вылетает ошибка divide by zero. Т.е как я понял частное от деления не помещается в АХ, т.к число ну очень большое 10339566. Как быть? При мелких числах все отлично работает

Вот код. Значение при запуске программы С = 8193. D = 1040; Вывод ответа в консоль в процедуре output. Арифметические действия в calculate. Подправьте код, пожалуйста) завтра нужно сдавать работу..
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
TITLE Laba_1
data segment  
    buffer db 80
    inputC db 10,13,'C = $'
    inputD db 10,13,'D = $'
    otvet db 10,13,'Otvet: $'
    a dw 07FFh
    b dw 00FFh
    c dw ?
    d dw ?
    rezult db 9 dup ('$')
    dorez dd 0
data ends
code segment
    assume cs:code,ds:data
begin:
    mov ax,data
    mov ds,ax
    call vvodCD
    call calculate
    call output
    ; вывод результата
    mov ah,09h          ; сообщение 
    lea dx,otvet
    int 21h
    mov ah,09h     ; вывод самого числа
    lea dx,rezult
    int 21h
    mov ah,1            ; ожидание нажатия
    int 21h
    
    mov ax, 4c00h  
    int 21h 
vvodCD:
    mov ah,09h
    lea dx, inputC  
    int 21h
    mov ah,0ah
    xor di,di
    mov dx,offset buffer ; адрес буфера
    int 21h ; принимаю строку
    mov dl,0ah
    mov ah,02
    int 21h ;
    call read
    mov c, ax
    
    mov ah,09h
    lea dx, inputD  
    int 21h
    mov ah,0ah
    xor di,di
    mov dx,offset buffer ; адрес буфера
    int 21h ; принимаю строку
    mov dl,0ah
    mov ah,02
    int 21h ;
    call read
    mov d, ax
ret
calculate:
    mov ax, b
    sub ax, d
    add ax, a
    mul c
    lea di, dorez
    add [di], ax
    add [di+2], dx
ret
output:
    lea di, rezult      ; готовый результат для печати
    lea si, dorez   ; ответ без преобразования
    mov bx, 10 ; делитель для 10 сс
    xor cx,cx ; сброс счетчика символов
    mov ax, [si]    ; младшая часть
    mov dx, [si+2]   ; старшая часть
ASCII:   ; преобразование результата в символы, с сохранением в стек
    xor dx,dx 
    div bx ; деление DX:AX на 10 с остатком в dx
    add dl,'0' ; из числа в символ 
    push dx         ;сохранение отстатка в стек
    inc cx
    test ax,ax    ; проверка АХ на ноль 
    jnz ASCII
    
recordRezult:           ;Цикл извлечения символов из стека
    pop dx          ;Восстановление символа из стека
    mov [di],dl     ;Сохранение символа в буфере
    inc di          ;Инкремент адреса буфера
    loop recordRezult
ret
 
read:   
    mov si,offset buffer+2 ; берем аддрес начала строки. Первые символы - инфа о строке.
    cmp byte ptr [si],"-" ; если первый символ минус
    jnz s1
    mov di,1  ; устанавливаем флаг
    inc si    ; и пропускаем его
s1:
    xor ax,ax
    mov bx,10  ; множитель 
obrabotka:
    mov cl,[si] ; символ из буфера
    cmp cl,0dh  ; проверяем не последний ли он
    jz endin ; если последний , переходим на endin
    sub cl,'0' ; делаю из символа число 
    mul bx     
    add ax,cx  ; прибавляем к остальным
    inc si     ; указатель на следующий символ, т.е берем след. символ
    jmp obrabotka   
; все символы из буфера обработаны число находится в ax
endin:
    cmp di,1 ; если установлен флаг отрицания, то
    jnz exit
    neg ax   ; Переводим число в доп код
exit:
    ret  
code ends        
END begin
0
Ушел с форума
Автор FAQ
 Аватар для Mikl___
16371 / 7683 / 1080
Регистрация: 11.11.2010
Сообщений: 13,757
24.05.2019, 04:33
aoeshka,
посмотри здесь
1
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8644 / 4479 / 1669
Регистрация: 01.02.2015
Сообщений: 13,883
Записей в блоге: 11
25.05.2019, 16:00
aoeshka, а также жаль, что вы проигнорировали мою ссылку.
Я же её просто так привёл, лишь бы в теме отметится.
0
0 / 0 / 0
Регистрация: 13.06.2015
Сообщений: 23
25.05.2019, 18:54  [ТС]
Я создаю темы, когда после долгих усилий не могу сам разобраться. Т.е прежде чем спросить у вас, я пересмотрел тонну материала, включая материал по этой ссылке, все что мог, извлек оттуда. И вы меня опять туда отправляете )

Добавлено через 4 минуты
А с чем может быть связан мусор после вывода результата в консоль? В какую сторону капать нужно.
0
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8644 / 4479 / 1669
Регистрация: 01.02.2015
Сообщений: 13,883
Записей в блоге: 11
25.05.2019, 19:14
Ой, простите великодушно!
А я-то, наивный, зачем-то в 2017 году публиковал там процедуру вывода на экран из регистровой пары dx:ax, пример использования. Думал, вдруг кому-то пригодится...

Что делать-то будем? Обратно отправлять?

Добавлено через 14 минут
В процедуре read в ch возможен "мусор".

Добавлено через 3 минуты
Я обычно весь код набираю поэтапно. Набираю ввод - проверяю на нескольких строках, потом вывод - проверяю на нескольких числах, потом обработку (проверяю не вводом, а константами). И только потом объединяю. Так я уверен в каждом фрагменте кода.

При каких входных данных у вас мусор?
0
780 / 412 / 75
Регистрация: 29.03.2013
Сообщений: 849
25.05.2019, 19:24
Лучший ответ Сообщение было отмечено ФедосеевПавел как решение

Решение

Цитата Сообщение от ФедосеевПавел Посмотреть сообщение
При каких входных данных у вас мусор?
первый вариант:
Цитата Сообщение от aoeshka Посмотреть сообщение
buffer db 80
;length db ?
string db 80 dup (0)
inputC db 10,13,'C= $'
второй вариант:
Цитата Сообщение от aoeshka Посмотреть сообщение
buffer db 80
inputC db 10,13,'C = $'
куда-то исчез сам буфер, при вводе должны затираться используемые данные.
2
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8644 / 4479 / 1669
Регистрация: 01.02.2015
Сообщений: 13,883
Записей в блоге: 11
25.05.2019, 19:45
После исправления ошибки определения буфера, вывод результата
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
data segment
    buffer db 7, 8 dup(0)
.................
    temp DW 2 dup(0)      ;переменная для сохранения частного от деления на 10
data ends
.................
code segment
    assume cs:code,ds:data
begin:
    mov ax,data
    mov ds,ax
    call vvodCD
    call calculate
    ; вывод результата
    mov ah,09h          ; сообщение
    lea dx,otvet
    int 21h
    mov ax, word ptr [dorez]
    mov dx, word ptr [dorez+2]
    call ShowUInt32
    mov ah,1            ; ожидание нажатия
    int 21h
 
    mov ax, 4c00h
    int 21h
.....................
;Вывод на экран целого 32 разрядного беззнакового числа
;на входе:
;  dx:ax - целое 32 разрядное беззнаковое число
ShowUInt32:
 
        ;сохранить значение числа во временной переменной
        mov     word ptr temp[0],       ax
        mov     word ptr temp[2],       dx
....................
@@ShowDigit:
        pop     dx              ;извлечение цифры из стека
        int     21h             ;вывод символа на экран
        loop    @@ShowDigit
 
        ret
 
code ends
END begin
0
3410 / 1829 / 489
Регистрация: 28.02.2015
Сообщений: 3,696
25.05.2019, 20:35
Лучший ответ Сообщение было отмечено ФедосеевПавел как решение

Решение

Цитата Сообщение от aoeshka Посмотреть сообщение
Я создаю темы, когда после долгих усилий не могу сам разобраться. Т.е прежде чем спросить у вас, я пересмотрел тонну материала, включая материал по этой ссылке, все что мог, извлек оттуда. И вы меня опять туда отправляете )
Копировать ссылку (Ввода-Вывода) не буду, но Вам туда. Там эксперты, чтобы добавить один грамм в эту тему, десятки тон(а не просто тону) "перелопатили" , а не смотрели.

Скажу сразу Вы вводите строку, её содержимое не анализируете , а просто "sub cl,'0' ; делаю из символа число " - круто, сабнули на ноль строку и у Вас сразу число. Я так не умею, буду у Вас учится, сколько стоит урок?

Особенно радует момент:
Assembler
1
2
3
4
5
    buffer db 80
    ;length db ?
    string db 80 dup (0)
    inputC db 10,13,'C= $'
    inputD db 10,13,'D= $'
Исправляя одну ошибку, добавляете еще десяток.
Assembler
1
2
3
4
    buffer db 80
    inputC db 10,13,'C = $'
    inputD db 10,13,'D = $'
    otvet db 10,13,'Otvet: $'
при этом ввод у Вас идет по
Assembler
1
2
3
4
    mov ah,0ah
    xor di,di
    mov dx,offset buffer ; адрес буфера
    int 21h ; принимаю строку
Ничего не заметили?
Ну, как я говорил - Вам нужно в тему "Ввода-Вывода", и не смотреть, а изучать , изучать , изучать, на каждой школе такой лозунг был.

О том куда смотрят, и что видят, даже вспоминать не хочется.
А и ещё, хамить экспертам форума не нужно, заставляя их просить прощения
Цитата Сообщение от ФедосеевПавел Посмотреть сообщение
Ой, простите великодушно!
от этого знаний у наших экспертов не убудет, а у Вас не добавится.

Добавлено через 53 секунды
блин пока писал, опередили.
1
25.05.2019, 20:46

Не по теме:

Он, вроде, и не хамил. Только читает плохо. Я выбрал неудачную форму, чтобы донести до aoeshka мысль, что нужно ещё раз перечитать закреплённую тему.

По некоторым признакам полагаю, что aoeshka работает в emu8086, и код в исходном виде ему не поможет - нужно иметь опыт работы в разных компиляторах.

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
25.05.2019, 20:46
Помогаю со студенческими работами здесь

Вывод числа на консоль
Здравствуйте. Есть программа для Ассемблера. Вычисление НОК для 4 чисел(Пока в программе реализовано для 2). После вывода на экран...

Некорректный вывод числа в консоль
Посчитал значение переменной ( проверил через дебаггер , считает правильно ), mov ax, @data mov ds,ax; mov...

Вывод числа в консоль Linux
Народ, как в fasm и nasm в linux выводить числа на консоль?

Вывод большого числа в консоль на C++
В общем делаю программу по извлечению квадратного корня из числа на с++. Но возникает проблема. Смотрел в отладке, все должно быть...

Вывод в консоль 2-ух Динамических массивов и 1 числа
Доброго времени суток. Происходит интересная магия в коде, которую мне не понять, но хочется обуздать. У меня есть 3 файла...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru