Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

программа для tasm

64K
05 декабря 2010 года
T_E_M_A
11 / / 05.12.2010
Помогите с программой.
Составить программу, которая последовательно (в цикле) вводит по одному целому числу и находит количество положительных чисел, которые не делятся на 10. Признак окончания работы программы – ввод нуля.

без понятия, как её делать?
как ввести ещё примерно знаю...а дальше..
записывать каждое число в отдельный реестр и сравнивать каждый с каждым? :confused:
252
05 декабря 2010 года
koderAlex
1.4K / / 07.09.2005
зачем ?
введёное число сравнить с нулём . если равно нулю , то выводим результат , а если нет , то проверяем знак и не делимость на 10 . если результат проверки положителен , та счётчик увеличивем .

ничего запоминать не надо .
64K
13 декабря 2010 года
T_E_M_A
11 / / 05.12.2010
а как проверить на знак?
316
13 декабря 2010 года
Alm3n
889 / / 29.05.2009
старший бит числа - 1 - отрицательно.сравнение с нулем?
ты же не забыл,что число из аски вида нужно в хекс еще переводить,нет?
64K
13 декабря 2010 года
T_E_M_A
11 / / 05.12.2010
помогите сделать. алгоритм я понял, а вот как реализовать в ассемблере...
316
13 декабря 2010 года
Alm3n
889 / / 29.05.2009
что именно в реализации вызывает затруднения?самым сложным я вижу тут перевод многосимвольных строк в числа,этот участо кода я могу кинуть сразу.правда,он не сама идеальность и в интернете куча более хороших алгоритмов.а в остальном-то какая проблема?
64K
13 декабря 2010 года
T_E_M_A
11 / / 05.12.2010
не могли бы написать как проверить положительное ли и не делится на 10?
316
13 декабря 2010 года
Alm3n
889 / / 29.05.2009
xor ax,ax
mov ax,num
cmp ax,0
ja bolshe_nulya
;меньше нуля
bolshe_nulya:
div 0Ah
cmp ah,0
jz delitsya
;не делится на ноль
delitsya:
7
13 декабря 2010 года
@pixo $oft
3.4K / / 20.09.2006
Цитата: Alm3n
 
Код:

;не делится на ноль

НА НОЛЬ!!!Ухаха!:D
Спасибо,повеселил:)

А проверку на знак можно сделать с помощью JS/JNS.Тогда будет как-то так

 
Код:
Test AX,AX
JNS Unsigned
<Здесь код для числа со знаком.Но его вроде по условию не предполагается.Но если будет…>
Jmp BlockEdge
Unsigned:
<Ну тут сам Бог велел>
BlockEdge:
И да,вместо сравнения с нулём лучше Test <Reg>,<Reg>.А xor ax,ax в начале вообще выкинуть.Зачем,если потом сразу же туда num пишется?
316
13 декабря 2010 года
Alm3n
889 / / 29.05.2009
Цитата: @pixo $oft
НА НОЛЬ!!!Ухаха!:D
Спасибо,повеселил:)


тяжелый день.ну все же поняли,что я имел в виду

Цитата:
А xor ax,ax в начале вообще выкинуть.Зачем,если потом сразу же туда num пишется?


привычка.таки я не указал какого типа в ax заносится значение,чтобы ah обнулить,очевидно же

7
13 декабря 2010 года
@pixo $oft
3.4K / / 20.09.2006
Цитата: Alm3n
mov ax,…

Тут уже всё указано.Команда Mov работает только с операндами одного размера

64K
13 декабря 2010 года
T_E_M_A
11 / / 05.12.2010
Цитата: Alm3n
тяжелый день.ну все же поняли,что я имел в виду


спасибо конечно, но я не понял(

316
13 декабря 2010 года
Alm3n
889 / / 29.05.2009
Цитата: @pixo $oft
Тут уже всё указано.Команда Mov работает только с операндами одного размера


ух ты,не знал.

Цитата:
спасибо конечно, но я не понял(


;не делится на 10

64K
13 декабря 2010 года
T_E_M_A
11 / / 05.12.2010
не работает. пишет ошибки в 12, и 17 строках
Код:
.model small
    .data  
    a   dw ?            ;место в памяти для введенного числа
str1    db  'Количество $'   ;сообщение, предваряющее вывод количеству
        .stack  32h
        .code  
        .startup
        extrn   read:near, writer:near
        call    read        ;вводим  число, оно попадает в ах
        cmp ax,0
        jz vveden_nol
        mov ax,num
        cmp ax,0
        ja bolshe_nulya
        ;меньше нуля
        bolshe_nulya:
        div 0Ah
        cmp ah,0
        jz delitsya
        ;не делится на ноль
        delitsya:
vveden_nol:
    mov     ah, 9       ;выводим строку-сообщение
    lea     dx, str1       
    int     21h    
    mov     ax,bx       ;восстанавливаем в ах значение суммы
    call    writer      ;и выводим количество чисел на экран

        .exit   0
        end
316
13 декабря 2010 года
Alm3n
889 / / 29.05.2009
в 12,потому что num нужно заменить на a,если в а читается число.какая ошибка в 17й строке?наверно,потому что число,а не регистр\память.
div 0Ah нужно заменить на
mov cx,0Ah
div cx
и,если число попадает в а,то его нужно переместить в ax,перед cmp ax,0
кстати,что за read\write?
7
13 декабря 2010 года
@pixo $oft
3.4K / / 20.09.2006
Цитата: Alm3n
ух ты,не знал

Как же вы раньше работали,не зная?Ассемблер нормально переваривал загон в двухбайтовый регистр 4х байтов?:D
Ну вообще есть определённый метод сопряжения,допустим,регистра(AX,например) и двойного слова,но всё равно операция будет осуществляться только с одним размером.Пример

 
Код:
Mov AX,Word Ptr SomeDWordVar
Таким образом мы получим младшее слово переменной SomeDWordVar(если мне память ни с кем не изменяет).Старшее получается аналогично,только смещение +2 надо добавить
Цитата: Alm3n
тяжелый день.ну все же поняли,что я имел в виду

Честно пися&#769;,я подумал,что имелся в виду как раз прикол:)

64K
14 декабря 2010 года
T_E_M_A
11 / / 05.12.2010
Код:
.model small
    .data  
    a   dw ?            ;место в памяти для введенного числа
str1    db  'Количество $'   ;сообщение, предваряющее вывод количеству
        .stack  32h
        .code  
        .startup
        extrn   read:near, writer:near
        call    read        ;вводим  число, оно попадает в ах
        mov ax,a
        cmp ax,0
        jz vveden_nol
        cmp ax,0
        ja bolshe_nulya
        ;меньше нуля
        bolshe_nulya:
        mov cx,0Ah
        div cx
        cmp ah,0
        jz delitsya
        ;не делится на 10   
        delitsya:
        xor ax,ax
        inc ax
vveden_nol:
    mov     ah, 9       ;выводим строку-сообщение
    lea     dx, str1       
    int     21h    
    mov     ax,bx       ;восстанавливаем в ах значение количества
    call    writer      ;и выводим количество чисел на экран

        .exit   0
        end

исправил. теперь ошибок нет. Но оно не работает ни разу. И цикл ещё надо поставить....чтоб оно работало, пока не введён 0.
Но оно и без цикла не работает(((
64K
14 декабря 2010 года
T_E_M_A
11 / / 05.12.2010
Цитата: Alm3n

кстати,что за read\write?



Для ввода целого числа будем пользоваться процедурой READ, после вызова которой введенное число попадает в регистр АХ. Для вывода на экран целого числа, находящегося в регистре АХ, будем использовать вызов процедуры WRITER.
Данные процедуры вызываются с помощью команды САLL. Эта команда передает управление процедуре, сохранив перед этим в стеке смещение к точке возврата. Процедура выполняется до тех пор, пока среди ее команд не встретится команда возврата RET, которая достает из стека адрес возврата и передает управление команде, следующей за командой САLL.
Поскольку процедуры READ и WRITER являются внешними для программы, которая будет их использовать, необходимо с помощью директивы EXTRN информировать компилятор о том, какие именно имена являются внешними, то есть определенными во внешнем модуле, скомпилированным самостоятельно и независимо от основного программного модуля. В нашем случае данная директива может быть использована следующим образом:

extrn read:near, writer:near

316
14 декабря 2010 года
Alm3n
889 / / 29.05.2009
Цитата: @pixo $oft
Как же вы раньше работали,не зная?


очень просто - никак.с самого начало у меня из-за какой-то ошибки не заработала такая конструкция, и я всегда использовал mov с косвенной адресацией,а там и размер операнда передавал через ptr.

Цитата: T_E_M_A
Для ввода целого числа будем пользоваться процедурой READ...


хорошо написанно,из какой книги?и страницу,если можно.также интересно,почему вы для вывода строки используете прерывание,а для вывода числа - функцию?

Цитата:
И цикл ещё надо поставить


она уже частично есть.

 
Код:
;не делится на 10    
        delitsya:
        xor ax,ax
        inc ax

на
 
Код:
;не делится на 10    
jmp main
        delitsya:
        xor ax,ax
        inc ax
jmp main

ну а main пихнуть чуть выше call read
316
18 декабря 2010 года
Alm3n
889 / / 29.05.2009
Код:
.MODEL SMALL
.STACK 64
data segment
sum db 0
in_buff db 5,?,5 dup(?)
mess db "Answ:"
out_buff db 5 dup(?)
shift db 0dh,0ah,'$'
num dw 0
data    ends

code    segment
assume cs:code, ds:data
START: 
        mov ax,data
        mov ds,ax
L1:     mov ax,0a00h
        lea dx,in_buff
        int 21h  
        mov ax,0900h
        lea dx,shift
        int 21h
        cmp [in_buff+2],'-'
        jz L1
        cmp [in_buff+2],'0'
        jz ext
        mov si,offset in_buff
        call AsciiToDword
        mov ax,num
        mov bx,0ah
        div bl
        cmp ah,0
        jz L2
        jmp L1
L2:     add sum,1
        jmp L1
ext:    lea si,out_buff
        call DwordToAscii
        mov ax,0900h  
        lea dx,mess        
        int 21h
        mov ax,0a00h
        lea dx,in_buff
        int 21h        
        mov ax, 4c00h  
        int 21h
       
AsciiToDword proc
        .386
        xor ax,ax
        mov bx,1
        mov cl,[si+1]
        add si,cx
        inc si
L:      mov al,[si]
        and al,0Fh
        mul bx
        add num,ax
        imul bx,10
        dec si
        loop L
        ret
AsciiToDword endp

DwordToAscii proc
.486
    xor dx,dx
    movzx ax,sum
    mov bx,10000
    mov cx,5
L3: div bx
    add ax,30h
    mov [si],al
    inc si
    push dx
    xchg ax,bx
    mov bx,10
    xor dx,dx
    div bx
    xchg bx,ax
    pop ax
    loop L3
    ret
DwordToAscii endp
CODE    ends
end START
64K
18 декабря 2010 года
T_E_M_A
11 / / 05.12.2010
Alm3n, огромное спасибо!
не сочтите за наглость, но не могли бы вы комментарии по вставлять?)
316
18 декабря 2010 года
Alm3n
889 / / 29.05.2009
думаете поможет?
Код:
.MODEL SMALL
.STACK 64
data segment
sum db 0                ;число положительных,кратных 10
in_buff db 5,?,5 dup(?) ;буффер вводимого числа
mess db "Answ:"
out_buff db 5 dup(?)    ;буфер выводимого числа
shift db 0dh,0ah,'$'
num dw 0
data    ends

code    segment
assume cs:code, ds:data
START: 
        mov ax,data
        mov ds,ax
L1:     mov ax,0a00h    ;чтение числа
        lea dx,in_buff
        int 21h  
        mov ax,0900h
        lea dx,shift
        int 21h
        cmp [in_buff+2],'-' ;если отрицательное
        jz L1
        cmp [in_buff+2],'0' ;если введен ноль
        jz ext
        mov si,offset in_buff
        call AsciiToDword   ;если ни то,ни то - переводим строку в число
        mov ax,num
        mov bx,0ah
        div bl              ;делим на 10
        cmp ah,0            ;в ah остаток от деления
        jz L2               ;если остаток = 0
        jmp L1
L2:     add sum,1
        jmp L1
ext:    lea si,out_buff    
        call DwordToAscii   ;число в строку
        mov ax,0900h        ;вывод на экран
        lea dx,mess        
        int 21h
        mov ax,0a00h
        lea dx,in_buff
        int 21h        
        mov ax, 4c00h  
        int 21h
       
AsciiToDword proc
        .386
        xor ax,ax
        mov bx,1
        mov cl,[si+1]
        add si,cx
        inc si
L:      mov al,[si]
        and al,0Fh
        mul bx
        add num,ax
        imul bx,10
        dec si
        loop L
        ret
AsciiToDword endp

DwordToAscii proc
.486
    xor dx,dx
    movzx ax,sum
    mov bx,10000
    mov cx,5
L3: div bx
    add ax,30h
    mov [si],al
    inc si
    push dx
    xchg ax,bx
    mov bx,10
    xor dx,dx
    div bx
    xchg bx,ax
    pop ax
    loop L3
    ret
DwordToAscii endp
CODE    ends
end START

алгоритмы перевода строки в число и числа в строку просты:
1)от каждого символа отнимает 30h,получаем разряд числа,умножаем его на число,эквивалентное разряду,суммируем.
2)число делится сначало на самый старший эвивалент разряда,получаем разряд,добавляем 30h и приводим к аски символу,записываем в строку,повторяем циклично.эквивалент разряда с каждой итерацией уменьшается
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог