Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Assembler :: Вывод числа

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки

Открыть новую тему     Написать ответ в эту тему

moviegear

Junior Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Требуется следующее:
"Представить алгоритм и программу вычисления при заданном X значения функции
Y =5+2*( X +1) при X >10. Y =( X **2+1)/2 при 1< X <10. Y = X -2 при X <=1"
Алгоритм ясен и понятен, написал следующее:

Код:

model small
stack 100h
 
dataseg
 
Inputx db 0Dh,0Ah
db "Введите х:","$"
g1 db 0dh,0ah
db "y = ","$"
 
codeseg
startupcode
 
lea DX,Inputx  
mov ah,09h      
int 21h
 
mov ah,01h
int 21h
 
mov ah,0
 
  mov bx,10
  cmp ax,bx
  jg xbigten
 
  mov bx,1
  cmp ax,bx
  jg xoneten
 
  sub ax,2
  jmp xend
 
xbigten:
 inc ax
 mov cx,2
 imul cx
 mov cx,5
 add ax,cx
 jmp xend
 
xoneten:
 mov cx,2
 imul cx
 inc ax
 cwd
 idiv cx
 jmp xend
 
xend:
 
quit:exitcode 0
end

 
Никак не могу сообразить как вывести число, т.к. сам ламер в программировании, есть примеры насчёт вывода 10/16чных чисел, но не помогло... видать проблема в ДНК =)
Кто поможет что мне писать между xend и quit, тому буду очень сильно благодарен!!!
Спасибо!

Всего записей: 41 | Зарегистр. 10-02-2005 | Отправлено: 00:10 11-02-2005 | Исправлено: moviegear, 00:15 11-02-2005
MOFA



Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
при X >10

 
   Вам вначале нужно поработать над вводом, первая функция 21-го прерывания вводит СИМВОЛ с клавиатуры с выводом его на экран, так что Вы не сможете ввести число больше 9.

Всего записей: 20 | Зарегистр. 29-01-2005 | Отправлено: 01:48 11-02-2005
moviegear

Junior Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
2 MOFA: понял, исправил...
А насчёт вывода кто-нибудь подскажет?

Всего записей: 41 | Зарегистр. 10-02-2005 | Отправлено: 14:32 11-02-2005
MoKC0DeR



Full Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
moviegear
Обратным процессом преобразуете число в последовательность символов.

Всего записей: 510 | Зарегистр. 31-03-2004 | Отправлено: 15:13 11-02-2005
akaGM

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
а чем примеры не подходят?
 
если уж речь зашла об "очке"-- 21h гы,
то используй 9ую функцию...
щас...
ага, вот:
 
ah == 9h
ds:dx == $-терминатед стринг...
 
 
 
Добавлено:
----------
опс
 
посмотрел код...
ты это лучше меня знаешь...
 
Добавлено:
----------
чтобы хоть чем-то помочь...
 
число 123450
чтобы превратить _число_ его в "печатабельную" строку, можно его _каждую цифру_ преобразовать к аски-символу, добавив 30h:
 
т.е.
0 --> 0+30h или 0 + '0'  == "код нуля '0' = 48 в множестве аски"
1 --> 1+30h или 1 + '0' == "код единицы '1' = 49 в множестве аски"
2 --> 2+30h или 2 + '0' ...
3 --> 3+48 или 3 + '0' ...
и тд
 
может поможет...
 
----------

Цитата:
т.к. сам ламер в программировании

хорошая шутка для пишущего на ассемблере...

Всего записей: 24116 | Зарегистр. 06-12-2002 | Отправлено: 16:00 11-02-2005 | Исправлено: akaGM, 16:41 11-02-2005
MoKC0DeR



Full Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
в качестве примера по выводу

Код:
 
.Model Tiny
.Code
                org     100h
start:
xor ax, ax
xor bx, bx
xor dx, dx
 
mov al, c
mov bl, d
add ax, bx ; ax = c + d
mov bx, ax
mul bx
mov bx, ax  ; bx = (c + d)^2
 
mov al, b
mul b
mul b
mov cx, ax ; cx = b ^3

mov al, a
mul a ; ax = a ^ 2
mul a ; ax = a ^ 3
sub ax, cx  ; ax = (a^3) - (b^3)
 
div bx
 
                lea     di, dResult - 2
                call    PrintDEC    ; Преобразование числа в символьный вид
 
                mov     dx, offset sResult
                mov     ah, 09h
                int     21h         ; Печать результата на экране
 
                int     20h         ; Завершение работы программы
 
PrintDEC        PROC
                std
PH1:            xor     dx, dx      ; dx =0 чтобы избежать переполнения при
                                    ; деление на 10
                mov     cx, 10
                div     cx
                add     dl, '0'     ; преобразуем число в символьный вид
                xchg    ax, dx
                stosb               ; запоминаем в памяти по es:di
                xchg    ax, dx
                test    ax, ax      ; Пока не ноль преобразуем
                                    ; в десятичный вид
                jnz     PH1
                ret
ENDP            PrintDEC
 
a   db      6
b db 4
c db 2
d db 1
y dw ?
sResult         db      'Результат равен      $'
dResult         equ     $
 
end start
 
 

Всего записей: 510 | Зарегистр. 31-03-2004 | Отправлено: 16:40 11-02-2005
moviegear

Junior Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
По совету MoKC0DeR'а сделал следующее:

Код:
.Model Tiny  
.Code  
org     100h  
 
start:  
 
xor ax, ax  
xor bx, bx  
xor dx, dx  
lea DX,Inputx  
mov ah,09h        
int 21h  
mov ax,5
 mov bx,10
 cmp ax,bx
 jg xbigten
 
 mov bx,1
 cmp ax,bx
 jg xoneten
 
 sub ax,2
 jmp xend
xbigten:
inc ax
mov cx,2
imul cx
mov cx,5
add ax,cx
jmp xend
xoneten:
mov cx,2
imul cx
inc ax
cwd
idiv cx
jmp xend
xend:
 
                lea     di, dResult - 2  
                call    PrintDEC    ; Преобразование числа в символьный вид  
                mov     dx, offset sResult  
                mov     ah, 09h  
                int     21h         ; Печать результата на экране  
                int     20h         ; Завершение работы программы  
 
PrintDEC        PROC  
                std  
PH1:          xor     dx, dx      ; dx =0 чтобы избежать переполнения при  
                                    ; деление на 10  
                mov     cx, 10  
                div     cx  
                add     dl, '0'     ; преобразуем число в символьный вид  
                xchg    ax, dx  
                stosb               ; запоминаем в памяти по es:di  
                xchg    ax, dx  
                test    ax, ax      ; Пока не ноль преобразуем  в десятичный вид  
                jnz     PH1  
                ret  
ENDP            PrintDEC  
 
Inputx db 0Dh,0Ah  
db 'Введите х: ','$'  
sResult         db     0Dh,0Ah
                   db     'Результат равен      $'  
dResult        equ     $  
 
end start  

 
Теперь же проблема в том, что я ввожу с клавы:

Код:
mov ah,01h
int 21h

 
Но в регистр AL помещается код введенного символа... а не значение...
Как теперь быть? MOFA прав...
+ если я ввожу 1, у меня в итоге ответ отрицательный, то выдаёт - 65535 =(
Похоже процедура ввода неправильная, вернее не та, что нужна...

Всего записей: 41 | Зарегистр. 10-02-2005 | Отправлено: 00:20 13-02-2005
akaGM

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
 Но в регистр AL помещается код введенного символа... а не значение...  

 
sub al, '0'
 
не подойдет?

Всего записей: 24116 | Зарегистр. 06-12-2002 | Отправлено: 23:34 13-02-2005
moviegear

Junior Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
2 akaGM: большое спасибо, ввод сделал так:

Код:
 
mov ah,01h
int 21h
 
sub al,'0'
mov ah,0
 

 
Осталось разобраться, что делать при отрицательном результате, т.к. при 0 - 65534, при 1 - 65535...
 
+ надо вводить хотя бы 2-х значные числа...

Всего записей: 41 | Зарегистр. 10-02-2005 | Отправлено: 10:10 14-02-2005 | Исправлено: moviegear, 10:11 14-02-2005
Looking



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
moviegear
Посмотри http://www.listsoft.ru/2590/

Всего записей: 1814 | Зарегистр. 02-06-2004 | Отправлено: 10:50 14-02-2005
akaGM

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
moviegear
щас, обожди...
 
проблема в том, что когда ты вводишь _первый_ символ с клавиатуры, то он будет
являться первым _левым крайним_ символом числа (т.е. самой старшей цифрой)
 
вот тебе алгоритм ввода:
 
-вводишь один символ с клавы по 21h (ah=1)
-формируешь _строку_ символов этого ввода
(какой-нибудь stosb)
string=c1c2c3c4  c1..c4 -- символы  
считай и получай длину строки L (кол-во введенных символов)
 
когда весь ввод закончен, то надо преобразовать полученную строку в число...
это можно сделать как-то так:
обрабатывай строку длиной L с _конца_
cx=L
loop:
al=текущий символ
sub al, 30h
число копится и формируется так
number = c4 + 10 * с3 + 100 * с2 + 1000 * с1    ;etc
dec cx
...
э-э-э
забыл я на фиг весь ассемблер...
 
 
это все что касается целочисленной арифметики...
 
если ввод в формате k.nE-m,
то я -- пас

Всего записей: 24116 | Зарегистр. 06-12-2002 | Отправлено: 15:08 14-02-2005 | Исправлено: akaGM, 15:11 14-02-2005
Vid0



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Код:
        .model  tiny
        .data
 
sInpMsg db      0dh, 0ah, "Number: $"
sResMsg db      0dh, 0ah, "Result: $"
sErrMsg db      0dh, 0ah, "Error!$"
 
        .code
        org     100h
 
start:
        lea     dx, sInpMsg
        mov     ah, 09h
        int     21h
 
        call    Input10
        jc      errExit
 
        cmp     ax, 10
        jg      xBigTen
 
        cmp     ax, 1
        jg      xOneTen
 
        sub     ax, 2
        jmp     short xEnd
 
xBigTen:
        inc     ax      ;      x+1
        rcl     ax, 1   ;   2*(x+1)
        jo      errExit ;       ---owerflow
        add     ax, 5   ; 5+2*(x+1)
        jo      errExit ;       ---owerflow
        jmp     short xEnd
 
xOneTen:
        rcl     ax, 1   ;  x*2
        inc     ax      ;  x*2+1
        rcr     ax, 1   ; (x*2+1)/2
 
xEnd:
        push    ax
 
        lea     dx, sResMsg
        mov     ah, 09h
        int     21h
 
        pop     ax
        call    print10
        int     20h
 
errExit:
        lea     dx, sErrMsg
        mov     ah, 09h
        int     21h
        int     20h
 
input10 proc
        push    bx
        push    cx
        push    dx
        push    si
 
        xor     si, si
        lea     di, inp
        mov     dx, di
        mov     ah, 0ah
        int     21h
 
        add     di, 2
        xor     cx, cx
        mov     al, [di]
        cmp     al, '+'
        je      i3
        cmp     al, '-'
        jne     i1
        mov     si, 1
        jmp     short i3
i1:     cmp     al, 0dh
        je      i_exit
        cmp     al, '0'
        jb      err1
        cmp     al, '9'
        ja      err1
        sub     al, '0'
        shl     cx, 1
        cmp     cx, 32767
        ja      err2
        mov     bx, cx
        shl     cx, 1
        cmp     cx, 32767
        ja      err2
        shl     cx, 1
        cmp     cx, 32767
        ja      err2
        add     cx, bx
        cbw
        add     cx, ax
        cmp     cx, 32767
        ja      err2
i3:     inc     di
        mov     al, [di]
        jmp     short i1
i_exit: cmp     si, 1
        jne     i2
        neg     cx
i2:     mov     ax, cx
        clc
i4:     pop     si
        pop     dx
        pop     cx
        pop     bx
        ret
err1:   stc
        mov     ax, 1
        jmp     short i4
err2:   stc
        mov     ax, 2
        jmp     short i4
.data
inp     db      7, 0, 7 dup(?)
input10 endp
 
print10 proc
        push    ax
        push    bx
        push    cx
        push    dx
        xor     cx, cx
        test    ax, ax
        jge     p1
        mov     dl, '-'
        neg     ax
        jmp     short p2
p1:     mov     dl, ' '
p2:     push    ax
        mov     ah, 02h
        int     21h
        pop     ax
        mov     bx, 10
p3:     cwd
        div     bx
        add     dl, '0'
        push    dx
        inc     cx
        test    ax, ax
        jnz     p3
        mov     ah, 02h
p4:     pop     dx
        int     21h
        loop    p4
        pop     dx
        pop     cx
        pop     bx
        pop     ax
        ret
print10 endp
 
end start

Всего записей: 95 | Зарегистр. 29-05-2002 | Отправлено: 05:46 19-02-2005
1lex1

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Как вывести знак на экран? Компилятор MASM.

Код:
.686
.model flat, stdcall
 
.data
 
.data?
 
.code
start:
        mov    dl,    48h
        mov    ah,    02h
        int    21h
end start

При отладке на команде int    21h выдаёт

Цитата:
Program received signal SIGSEGV, Segmentation fault.

Что не то в использовании int    21h ?
Заранее спасибо за ответ.

Всего записей: 278 | Зарегистр. 22-11-2013 | Отправлено: 23:47 05-01-2016
Открыть новую тему     Написать ответ в эту тему

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Assembler :: Вывод числа


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru