Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Assembler

Автор: aridtree
Дата сообщения: 09.05.2009 01:15

Цитата:
;;Z=(X+Y)*J J=1,2...5 :
DATAS SEGMENT 'data'     ;;'classOfSegment'-пишем класс сегмента
X DW 3
Y DW 6
J DW ?
I DW 0,0,0,0,0,0,0,0,0,0
DATAS ENDS
CODES     SEGMENT 'code' ;;'classOfSegment'
ASSUME CS:CODES,DS:DATAS
PROGRAM:
;;здесь верно - загрузка прог сегментов
MOV AX,DATAS                
MOV DS,AX
;;неясно зачем дальнейший код, немного повергает в шок...
MOV CX,10
MOV AX,0
;;следующая команда значит "если СХ ==0 переходим на метку К." Причём СХ при любом раскладе =10.
JCXZ K
;;вообще зачем?)))
A: INC AX
LOOP A
;;вот до сюда
;;эквивалент всему этому add AX,10


;; всё это уже больше похоже на правду
MOV CX,5
MOV J,5
MOV BX,OFFSET I
B: MOV AX,X
;;складываете два операнда памяти - нельзя
ADD X,Y
MUL J
MOV [BX],AX
ADD BX,2
DEC J
MOV DX,J
CMP J,DX
LOOPZ B
JMP K
K:
mov I,ax
MOV AX,4C00H
INT 21H
CODES ENDS
END PROGRAM

В общем оч сложно код подкорректировать.
Видимо Вы имели ввиду под
Цитата:
мы не так эти програмки пишем
использовать полные наименования программных сегментов циклов Loop...
Полупереписал)


Цитата:
;;Z=(x+y)*J J=1...5

DATAS SEGMENT 'data'
X DW 3
Y DW 6
J DB ?
I DW 0,0,0,0,0,0,0,0
DATAS ENDS
CODES     SEGMENT 'code'
ASSUME CS:CODES,DS:DATAS
PROGRAM:
MOV AX,DATAS            ;;загрузка адресса сегмента данных в сегментный регистр
mov DS,AX

mov AX,X                ;; пихаем Х в АХ             AX=X
add AX,Y                ;;прибавляем к Х в АХ У AX=X+Y

mov CX,5                ;;готовимся к циклу - в СХ кол-во итераций
mov BX,offset I        ;; в ВХ пишем адресс памяти куда ответ писать
mov J,1                ;;J=1()не на всех машинах вроде грузится - мб mov DX,1 mov J,DX
mov [BX],AX            ;; пишем ответ при J=1

next:
mov DX,AX                ;;сохраняем в резерве DX наше значение
inc J                    ;;берём очередное J
mul J                    ;;умножаем наше X+Y на число J    AX=(X+Y)*J
add BX,2                ;;берём след ячейку памяти
mov [BX],AX            ;;и пишем в неё ответ
mov AX,DX                ;;восстанавливаем AX
loop next                ;;идём к следующему J.
;;на самом деле алгоритм несколько хромает
;;логичнее было бы на каждое увеличение J просто прибавлять
;; группу X+Y, так оно быстрее. Не переделывал, дабы решать по примеру и подобию

MOV AX,4C00H
INT 21H
CODES ENDS
END PROGRAM

Автор: Ickorka
Дата сообщения: 10.05.2009 15:20
Ааааа)класс, спасибо)даже работает ^_^
Сейчас попробую для своего примера сделать z=(x+6)*J/(13-Y) при J=1,2,..7 :
Правильно или нет...?) А где-то показывает масив который получился.....?
DATAS SEGMENT 'data'
X DW 3
Y DW 6
J DB ?
I DW 0,0,0,0,0,0,0,0
DATAS ENDS
CODES SEGMENT 'code'
ASSUME CS:CODES,DS:DATAS
PROGRAM:
MOV AX,DATAS
mov DS,AX
mov ax,x
add ax,6
mov bx,13
sub bx,y
idiv bx
mov CX,7
mov BX,offset I
mov J,1
mov [BX],AX
next:
mov DX,AX
inc J
mul J
add BX,2
mov [BX],AX
mov AX,DX
loop next
MOV AX,4C00H
INT 21H
CODES ENDS
END PROGRAM

А если услове тоже самое (z=(x+6)*J/(13-Y)) , но нужно найти в цикле смещение элемента массива в котором записано число 0 а сам масим записать как I DB 4,0,5,6,7,8,9,10....что изменится и гед будет указываться то смещение?)
Зарание, спасибо )
Автор: aridtree
Дата сообщения: 10.05.2009 23:50
Ickorka
перезагружаться в винду лень)))
но вижу как минимум одну ошибку/полуошибку так:

Цитата:
idiv bx

при делении делимое должно находиться в AX,DX:AX если не подключена директива .386 и EAX, если подключена.
И всё бы хорошо, но делимое должно быть вдвое больше делителя, а частное по размерности равно делителю.
Таким образом, раз вы пишете idiv BX, то вы должны гарантировать, что DX=0. Т.е. крайне желательно перед делением xor DX,DX.
Дальше так же как и в примере (А+Б )*Джи, потому врят ли там ошибки))

Массив смотреть в дебаге... он(дебаг) вещь крайне полезная, практически жизненно необходимая.
Я, если честно, не понял, что Вы имелли ввиду под
Цитата:

А если услове тоже самое (z=(x+6)*J/(13-Y)) , но нужно найти в цикле смещение элемента массива в котором записано число 0 а сам масим записать как I DB 4,0,5,6,7,8,9,10....что изменится и гед будет указываться то смещение?)

Автор: Ickorka
Дата сообщения: 11.05.2009 09:50

Цитата:
А если услове тоже самое (z=(x+6)*J/(13-Y)) , но нужно найти в цикле смещение элемента массива в котором записано число 0 а сам масим записать как I DB 4,0,5,6,7,8,9,10....что изменится и гед будет указываться то смещение?)

ну походу вместое этого I DW 0,0,0,0,0,0,0,0 записать это DB 4,0,5,6,7,8,9,10..и найти нолик...)наверное так)П.С. Бороды у меня нету
Автор: aridtree
Дата сообщения: 11.05.2009 18:59
Ickorka


Цитата:

data SEGMENT 'data'
Iscorka db 1,3,84,13,0,13,2,6
Len equ $-Iscorka
data ENDS
code SEGMENT 'code'
assume CS:code,DS:data
start:
    mov AX,data
    mov ES,AX
    lea DI,Iscorka
    xor AL,AL
    mov CX,Len

    repne scasb
    jcxz net_nolia
    mov AX,Len
    sub AX,CX            ;AX - shift
    dec AX                ;-1, after scas pointer on next
net_nolia:
    mov AX,4c00h
    int 21h
code ENDS
END start

Типа того наверное...
(Искать-ищет, вот только то ли Вам надо?)))
Автор: Ickorka
Дата сообщения: 11.05.2009 19:31
Некоторые строчик не знаю, что означают...)

Цитата:
data SEGMENT 'data'
Iscorka db 1,3,84,13,0,13,2,6
Len equ $-Iscorka _______________________эта
data ENDS
code SEGMENT 'code'
assume CS:code,DS:data
start:
mov AX,data
mov ES,AX ____________________________почему ES , ане DS
lea DI,Iscorka ______________эта
xor AL,AL ___________что за AL?
mov CX,Len _______опять таки, что за Len*

repne scasb _______это
jcxz net_nolia
mov AX,Len ___________*
sub AX,CX ;AX - shift
dec AX ;-1, after scas pointer on next
net_nolia:
mov AX,4c00h
int 21h
code ENDS
END start

Спасибо
А такое можете посмотреть? :
Установить, сбросить в регистре AX:
биты в 1 тетрады AX
2,9,12,13 4 6317h
Автор: aridtree
Дата сообщения: 11.05.2009 20:17

Цитата:
mov ES,AX ____________________________почему ES , ане DS

строчная комманда scasb требует, чтобы сравниваемая строка находилась в ES:DI


Цитата:
Len equ $-Iscorka _______________________эта

а-ля константа ассемблера, дословно значит "из текущего положения указателя на память вычесть метку"
дабы получить размер массива.(Чтобы ежели нужда будет добавить ещё элемент прога работала)

Цитата:
lea DI,Iscorka ______________эта

загрузка эффективного адреса в DI, опять же для скаса

Цитата:
xor AL,AL ___________что за AL?

AL- это младшая часть регистра AX.

Цитата:
mov CX,Len _______опять таки, что за Len*

-"-

Цитата:
repne scasb _______это

волшебная команда "Искать в ES:DI AL", когда найдёт - соскакивает на следуйщий элемент.






Добавлено:

Цитата:
Установить, сбросить в регистре AX:
биты в 1 тетрады AX
2,9,12,13 4 6317h

биты

Цитата:

xor AX,AX
or AX,0011001000000100b


тетрады

Цитата:

xor AX,AX
or AX,0f000h


Цитата:

mov AX,6317h




Автор: kavidi
Дата сообщения: 12.05.2009 17:06
Помогите исправить ошибки в программе (решение квадратного уравнения) :

[more]
.286
.model small
.data

a dd 2.0
b dd 4.0
c dd 2.0
D dd ?
mes1 db 'No roots! $'
temp dd 4.0
temp2 dd 2.0

.stack 256h
.code
;Main PROC
main proc

push @data
pop ds
;;;;;;;;;;;;;;;;;;;;;

finit

; discriminante
; D = sqr(b)-4*a*c

fld b
fmul b
fld a
fld temp

fmul
fld c
fmul
fsubp st(1),st(0)
fst D

; <=>

ftst
fstsw ax
sahf

jc j1
jz j2

; D > 0
; X1 = (-b-sqrt(D))/(2*a)
; X2 = (-b+sqrt(D))/(2*a)

finit

fld temp2
fmul a
fld D
fsqrt
fld b
fchs

fsave temp2[4]
frstor temp2[4]

fsubr
fdivr ; first root

frstor temp2[4]

fadd
fdivr ; second root

jmp ex

; D < 0
; !no roots!

j1: mov ah, 09h
mov dx, offset mes1
int 21h
jmp ex

; D = 0
; X = -b/(2*a)

j2: finit
fld temp2
fmul a
fld b
fdivr
fchs ; root

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

ex: mov ax, 04C00h
int 21h

main endp
;end of main

end main[/more]
Автор: Prober
Дата сообщения: 12.05.2009 18:26
kavidi
Где-то я это уже видел...
Нашел: http://liloisproj.narod.ru/res_kv.htm
Автор: Ickorka
Дата сообщения: 12.05.2009 19:24

Цитата:
xor AX,AX
or AX,0011001000000100b
**
тетрады
xor AX,AX
or AX,0f000h
***
mov AX,6317h

Спасибо...))))только а как его в программу....
Автор: Liven200590
Дата сообщения: 14.05.2009 14:53
Помогите пожалста,,,, одну задачу на ассемблере.... очень срочно.... 1.    Дан массив из 9 байт. Рассматривая его как массив из 72 бит, посчитать число переходов между нулями и единицами.
Автор: aridtree
Дата сообщения: 14.05.2009 18:18
Liven200590

Код:
.model tiny
.code
org 100h
start:
mov AX,CS
mov DS,AX

mov DI,offset mas
mov SI,DI
add SI,9
mov AL,byte ptr [DI]
mov cflag,AL
xor BX,BX

nextByte:
mov AL,[DI]
mov AH,cflag
ror AH,1
xor AH,AL
test AH,10000000b
jz ctbIkO
inc BX
ctbIkO:
mov DL,AL

shr DL,1
jc Scfl
mov cflag,byte ptr 0
jmp tuda
Scfl:
mov cflag,byte ptr 1
tuda:

xor AL,DL
mov CL,1
vse:
test AL,CL
jz nextEl
inc BX
nextEl:
shl CL,1
jnc vse

inc DI
cmp DI,SI
jne nextByte

mov AX,4c00h
int 21h
mas db "asdfghjkl"
cflag db 0
end start

Автор: Firemanser
Дата сообщения: 14.05.2009 19:17
Если у кого будет время и желание, помогите исправить баг с этой программой - проигрывателем CD дисков. Баг в том, что нажатие кнопки "|<" всегда ставит на первый трек, а нажатие ">|" всегда на второй. Мне кажется, собака порылась тут: 004031DB, инструкция seek cdaudio to
_http://tim-soft.narod.ru/download/CD-Player.exe
Автор: Katenok0711
Дата сообщения: 17.05.2009 16:28
Люди, пожалуйста, помогите!!!!!задачи вроде не очень сложные...но я на занятия ходила чаще препода=) но задачки сдать нужно...
Вот они:
1. Работа со строками(строки вводятся пользователем с клавиатуры)
а)вычисление длины строки
б)конкатенация двух строк(склеивание)
в)реверс строки
г)поиск подстроки в заданной строке
д)преобразование всех символов в строке в верхний/нижний регистр

2.Преобразование типов данных
а)перевод целых чисел со знаком в строку
б) перевод строки в число. Реализовать обработку некорректного ввода данных
в)Перевод числа из исходной системы счисления в требуемую(основания исходной и требуемой системы счисления от 2 до 16; все исходные данные вводятся с экрана)
г) вычисление n-ого члена последовательности Фибоначчи

Пожалуйста!!!!помогите!!!!!очень нужно=) Заранее огромное СПАСИБО!!!
Автор: Aisha_Dare
Дата сообщения: 19.05.2009 17:03
очень нужна ваша помощ!!
не могу написать на асемблере((
ход выполнения:
*создать масив чисел случайного порядка(не больше 20 элементов)
*вывести его на экран
*отсортировать
метод:
Алгоритм состоит в повторяющихся проходах по сортируемому массиву. За каждый проход элементы последовательно сравниваются попарно и, если порядок в паре неверный, выполняется обмен элементов. Проходы по массиву повторяются до тех пор, пока на очередном проходе не окажется, что обмены больше не нужны, что означает — массив отсортирован. При проходе алгоритма, элемент, стоящий не на своём месте, «всплывает» до нужной позиции как пузырёк в воде, отсюда и название алгоритма.
http://ru.wikipedia.org/wiki/Сортировка_пузырьком здесь описание и примеры на разных языках
*вывести результат
очень на вас надеюсь, на С или Паскале не проблема, но асемблер никак не получается
заранее благодарю!!!
Автор: aridtree
Дата сообщения: 19.05.2009 23:32
Aisha_Dare
_http://liloisproj.narod.ru/asm_bul.htm

PS: уж что-что, а сортировки то мог бы и поискать в инете, ибо дело это высокотрадиционное, часто задаваемое)))
Автор: molko
Дата сообщения: 23.05.2009 14:07
Помогите решить задачу. Дано предложение.Определить сколько раз два соседних слова начинаются на одну букву. Предложение вводить с клавы не нужно, задается в программе
Автор: FSAV10
Дата сообщения: 25.05.2009 14:19
Помогите пожалуйста! Очень надо, горю((( написать программу обеспечивающую пропорционально-интегральное регулирование температуры путём изменения длительности импульса. Датчик температуры имеет выходное напряжение от 0.5 до 5в. Ширина импульса изменяется от 1 - 100мс.
Заранее спасибо!)
Автор: adator
Дата сообщения: 30.05.2009 00:07
Помогите, пожалуйста!
Задача такого типа: имеем 10 элементов типа байт. нужно найти максимальное количество одинаковых элементов.
Очень нужно, уже сегодня сдавать, а кроме этого ещё курсовик по станкам доделывать надо...
Автор: gummibar
Дата сообщения: 30.05.2009 23:43
Помогите пожалуста решить задачу!
Надо написать програму на асме для ввода и вывода чисел в массив 4х10 (символы надо вводить через пробел в строку!!!!) причём сделать так что бы можно было вводить отрицательные и положительные многозначные числа.
Автор: Asaqwe
Дата сообщения: 01.06.2009 00:49
Пожалуйста помогите с задачей (небесплатно).
Ввести двухмерный массив 4х4 трёхзначных чисел. В массиве поменять между собой числа побочной и главной диагоналей. Полученный и начальный массивы вывести на экран. Ввод, вывод, преобразования оформлять в виде процедуры. Числа вводить посимвольно (прерывание 21h). На тасме, 16-б. процессоры.
Предложения о сумме пишите, пожалуйста, в личку.
Автор: Lenrem
Дата сообщения: 02.06.2009 16:50
Народ помогите пожалуйста сделать простенькое задание к зачёту, затруднение в том что.....я его вообще не знаю)
вот задание


3.    Ввести с клавиатуры строку. Посчитать количество слов в строке. Определить, что является разделителем слов. Вывести результаты на экран.
(если можно с обьяснениями) спс)
Автор: Nevmind
Дата сообщения: 05.06.2009 02:32
Доброго времени суток всем! Кто может помочь с задачей (решить):
нужно в организовать страничную память, заполнить часть символами, начиная с FE заканчивая FF. То что окажется между ними, записать в массив неопределенного размера, то есть на каждом шаге размер массива надо увеличивать через GDT. В начале программы нужно зайти в защищенный режим, и выйти из него по окончании. Заранее спасибо.
P.S. В долгу не останусь.
Автор: alexcoder
Дата сообщения: 05.06.2009 21:38
Постучите в асю 368161244, есть опыт работы с защищенным режимом
Автор: msFast
Дата сообщения: 07.06.2009 06:37
Спасайте, сессия упала как снег на голову, с утра засел за Ассемблер и понял что парой дней его не осилишь, хотя другие языки знаю не плохо. А в понедельник сдавать две задачи. Если не сложно помогите.

1.Проверить является ли слово перевертышем. Слово ввести с клавиатуры и вывести ответ.
2.Найти среднеарифметическое одномерного массива. Кол-во эл-в и сами э-ты ввести с клавиатуры.

27 экзамен я выучу. А задачи в понедельник край нужны.
Возможен вариант денежной компенсации за Ваше потраченное время.
Автор: alexcoder
Дата сообщения: 07.06.2009 09:12
Постучите в асю 368161244, сделаю сегодня.
Автор: Ickorka
Дата сообщения: 07.06.2009 16:30

Помогите ещё раз.....нужно вычислить часть и остаток от деления минимального и максимального значений среди чисел Х1, Х2................,Х10. Используя при этом макро-команды, команды ввода-вывода, сдвига...
Автор: RNDDSTU
Дата сообщения: 08.06.2009 10:39
Добрый день!!
завтра будет проходить допуск к экзамену,нужно сдать задачи!!!
Помогите пожалуйста решить 2 задачки на ассемблере:
1.Разработать подпрограмму, которая преобразует заданное десятич-ное число в двоичную систему. Разработать программу, которая вводит с клавиатуры строку десятичных цифр и выводит на экран её эквивалент в двоичной системе. Если строка не является числом, то сообщает об этом.

2.Очистить экран. Вывести несколько строк произвольного текста (ат-рибут 14). Перехватив прерывание печати экрана Print Screen (Int 5h), ме-нять атрибуты всех строк экрана циклически от 1 до 15. Каждое нажатие клавиши Print Screen вызывает изменение атрибута.

Автор: kissenish
Дата сообщения: 11.06.2009 05:27
всем привет, помогите решить задачу. Решение линейниго диофантового уравнения:
X1+X2+X3+X4+...+Xn=n, n в[q][/q]
водится с клавиатуры. Результат вычислений – на экран.
Автор: ipsony144
Дата сообщения: 11.06.2009 17:15
Здравствуйте, не могу понять как исправить ошибку
intcmd_launch equ [bx-8]
intcmd_getcom equ [bx-6]
intcmd_off dw 0 ;Pointer to offset in COM file
intcmd_size dw offset intcmd_end - offset intcmd_start
intcmd_next dw 0 ;Ptr to next routine to append
intcmd_lnks dw 4
intcmd_start = $
dw offset launch_next ;Call to load and run program.
dw offset getcom_next ;Call to find shell name.

intcommand proc near
assume cs:code,ds:code,es:code,ss:code
push bx
call intcmd_1
intcmd_1:
pop bx ;Get pointer to sub calls.
mov di,si ;Copy ptr to command
dec di ;Back up to cmd line size.
mov al,process_rc ;Get and save return code
push ds
push ax
call intcmd_getcom ;Get comspec string.
call cs:intcmd_launch ;Run program.
pop ax
pop ds
mov process_rc,al ;Restore return code
pop bx
ret
intcommand endp
intcmd_end = $

ошибка "instruction operand must have size" в строчке call intcmd_getcom
используется masm32

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384

Предыдущая тема: .NET GUI компоненты


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.