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

» Assembler

Автор: arrhangel
Дата сообщения: 27.04.2011 21:05
простите за долгое отсутствие,
Molniev вы были правы , вызывал после Messagebox, зделал так:

invoke CreateService, hSCManager, $CTA0("PS2Versuch1.sys"), $CTA0("Nice Melody Beeper"), \
SERVICE_START + DELETE, SERVICE_KERNEL_DRIVER, SERVICE_DEMAND_START, \
SERVICE_ERROR_IGNORE, addr acDriverPath, NULL, NULL, NULL, NULL, NULL
        
            invoke GetLastError
            invoke wsprintf, addr contener, addr string, eax
            invoke MessageBox, NULL, addr contener, addr string, MB_ICONSTOP

выдало ошибку 1073
Автор: Abs62
Дата сообщения: 27.04.2011 21:37
arrhangel
1073 - ERROR_SERVICE_EXISTS. Сервис уже был создан ранее.
Тут надо сначала пробовать OpenService. А вот если она обломается и GetLastError вернёт 1060 (ERROR_SERVICE_DOES_NOT_EXIST), тогда уже звать CreateService.
Автор: arrhangel
Дата сообщения: 27.04.2011 23:53
как так может быть если я этот сервис запускаю в первые?
Автор: Abs62
Дата сообщения: 28.04.2011 00:20
arrhangel
А тут одного успешного вызова CreateService во время единственного запуска программы достаточно. Драйвер не до выхода из программы жить будет, он поселяется в системе насовсем. Точнее, пока его не убрать через DeleteService.
Автор: Chezara
Дата сообщения: 06.05.2011 20:56
Здравствуйте, хотел бы попросить помощи, задание у меня написать прогрмау на асемблере для интел 8080
и мне нужна комада корая проверяет на парность содержимое аккумулятора, если есть такая то буду очень признателен за помощь
Автор: borisdenis
Дата сообщения: 06.05.2011 21:42
Chezara

Сорри
Автор: Chezara
Дата сообщения: 06.05.2011 22:04
Я не просил за меня делать я попросил подсказать одну команду
Автор: ValidolX
Дата сообщения: 06.05.2011 22:13
Chezara

SETP/SETPE - Set if Parity / Set if Parity Even (386+). . . . . .
SETNP/SETPO - Set if No Parity / Set if Parity Odd (386+). . . . .
Автор: SERIOUS2
Дата сообщения: 08.05.2011 19:35
Есть такая вот для меня задача.

Задан одномерный массив. Вывести на экран элементы массива, которые больше 5 и их количество. Массив задать в сегменте данных или ввести с клавиатуры.

Вроде бы всё правильно сделал, только что-то не то.
[more=тут кусок кода]
cseg segment
assume cs:cseg,ds:cseg,es:cseg,ss:cseg
org 100h

start: mov ah,09h
mov dx,offset msg
int 21h
mov si,offset array
mov bx,5
mov cx,l_arr
srch: mov ax,[si]
xor dx,dx
div bx
cmp dx,0
jnz nxt
mov ax,[si]
call OutInt
mov al,','
int 29h
inc cnt
nxt: add si,2
loop srch
mov ah,09h
mov dx,offset mes_cnt
int 21h
xor ax,ax
mov al,cnt
call OutInt
ret


OutInt proc
push ax
push bx
push cx
push dx

xor cx, cx
mov bx, 10 ; основание сс. 10 для десятеричной и т.п.
oi2:
xor dx,dx
div bx
CMP [bx], dx
inc cx
test ax, ax
jnz oi2
mov ah, 02h
oi3:
pop dx
add dl, '0'
int 21h
loop oi3

pop dx
pop cx
pop bx
pop ax

ret

OutInt endp

array dw 1,15,25,134,7,50,83,250,65535,54,325,34,45
l_arr=($-array)/2
msg db 'Элементы массива, кратные пяти:$'
mes_cnt db 13,10,'Число элементов массива, кратных пяти:$'
cnt db 0

cseg ends
end start
[/more]
Автор: OldGopher
Дата сообщения: 08.05.2011 19:43
SERIOUS2
Подобные вещи легко делаются в Visual C++. Пишется код на С и компилируется в ассемблер. Потом надо почистить выход, для преподавателя.

Пролог-эпилог процедур не забыть выкинуть.

Для 16-ти битного надо старый Visual C++ 1.5. Думаю, найти не проблема.
Автор: SERIOUS2
Дата сообщения: 08.05.2011 19:46
OldGopher
Переслать строку произвольной длины, включив ее в состав другой, более длинной строки. Вывести полученную строку на экран. Строки описать в сегменте данных.

А вот это не знаешь даже как делать?
Просто мне дали такое задание, а фраза переслать смущает.


Мне не обязательно 16 бит, т.е. я могу в чём-нибудь по новее сделать?
Автор: SERIOUS2
Дата сообщения: 13.05.2011 06:45
Мне нужно три задачи было сделать, я не уверен в правильности этих задач, помогите люди пожалуйста

Программа вызывает процедуру, которая выводит символы. Параметры передаются через регистр. Тип процедуры дальняя. Процедура, вызывается 5 раз.

[more=первый кусок кода]
.model small
.data
msg1 db "First", 10, 13, '$'


.stack 100h

.code
begin:
mov ax,@data
mov ds,ax

mov dx,offset msg1    ; передаваемый процедуре параметр
call show        ; вызов процедуры


mov ah,4ch
int 21h        ; выход из программы

show proc far
; в регистре dx процедуре передается эффективный адрес строки
; для вывода
mov ah, 9
int 21h        ; вывод
ret
show endp
end begin

[/more]

Программа вызывает процедуру, которая выводит строку. Параметры передаются через стек. Тип процедуры дальняя.

[more=второй кусок кода]
data segment
op1 dw ?
msg1 db 'abc$'
data ends
stack1 segment stack
db 100h dup(?)
stack1 ends
code segment
assume cs:code,ds:data,ss:stack1
begin:
mov ax,data
mov ds,ax
mov op1,offset Proc1    ; в op1 – адрес процедуры Proc1
mov ax,offset op1    ; в ax – эффективный переменной op1
push ax            ; занесение в стек адреса переменной op1
call near ptr exec_proc    ; вызов exec_proc, на экран выводится
                ; строка ‘abc’ – выполняется Proc1, также
                ; значение op1 изменяется
push ax            ; занесение в стек адреса переменной op1 (ведь
            ; изменение значения не модифицирует адрес)
call near ptr exec_proc    ; вызов exec_proc, на экран выводится
                ; строка ‘xyz’ – выполняется Proc2
mov ah,4ch
int 21h
exec_proc proc near
push bp    ; все регистры, значения которых изменяются в
        ; процедуре, лучше всего всегда сохранять – так
        ; процедура никогда не изменит нормальных ход
        ; программы, из которой она вызывается
push bx
mov bp,sp
mov bx,[bp+6]    ; переданный параметр лежит по адресу bp+6,
            ; так как два байта занимает адрес возврата из
            ; процедуры, и 4 байта занимают сохраненные в
            ; стеке значения bx и bp
call word ptr [bx]    ; вызов процедуры, адрес которой находится в
            ; ячейке, адресуемой bx
Proc1 proc near
push dx
push ax
mov dx,offset msg1
mov ah,09h
int 21h    ; вывод строки ‘abc’
pop ax
pop dx
retn
Proc1 endp
code ends
end begin

[/more]


[more=второй кусок кода альтернатива]
data segment
op1 dw ?
msg1 db 'abc$'
msg2 db 'xyz$'
data ends
stack1 segment stack
db 100h dup(?)
stack1 ends

code segment
assume cs:code,ds:data,ss:stack1
begin:
mov ax,data
mov ds,ax

mov op1,offset Proc1    ; в op1 – адрес процедуры Proc1
mov ax,offset op1    ; в ax – эффективный переменной op1
push ax            ; занесение в стек адреса переменной op1
call near ptr exec_proc    ; вызов exec_proc, на экран выводится
                ; строка ‘abc’ – выполняется Proc1, также
                ; значение op1 изменяется
push ax            ; занесение в стек адреса переменной op1 (ведь
            ; изменение значения не модифицирует адрес)
call near ptr exec_proc    ; вызов exec_proc, на экран выводится
                ; строка ‘xyz’ – выполняется Proc2

mov ah,4ch
int 21h

exec_proc proc near
push bp    ; все регистры, значения которых изменяются в
        ; процедуре, лучше всего всегда сохранять – так
        ; процедура никогда не изменит нормальных ход
        ; программы, из которой она вызывается
push bx
mov bp,sp
mov bx,[bp+6]    ; переданный параметр лежит по адресу bp+6,
            ; так как два байта занимает адрес возврата из
            ; процедуры, и 4 байта занимают сохраненные в
            ; стеке значения bx и bp
call word ptr [bx]    ; вызов процедуры, адрес которой находится в
            ; ячейке, адресуемой bx
mov word ptr [bx],offset Proc2        ; изменение значения по
                        ; адресу, который был передан
                        ; процедуре exec_proc
pop bx        ; извлечение регистров, значения которых
        ; модифицировались в процедуре
pop bp
retn 2    ; выход из процедуры и удаление одного элемента стека –
    ; переданного параметра
exec_proc endp

Proc1 proc near
push dx
push ax
mov dx,offset msg1
mov ah,09h
int 21h    ; вывод строки ‘abc’
pop ax
pop dx
retn
Proc1 endp

Proc2 proc near
push dx
push ax
mov dx,offset msg2
mov ah,09h
int 21h    ; вывод строки ‘xyz’
pop ax
pop dx
retn
Proc2 endp

code ends
end begin
[/more]

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

[more=третий кусок кода]
.model small
.data
switcher dw ?        ; общая переменная, которая будет содержать
; эффективный адрес строки
msg1 db "First", 10, 13, '$'

.stack 100h

.code
begin:
mov ax,@data
mov ds,ax

mov switcher,offset msg1    ; глобальная переменная
call show            ; вызов процедуры


mov ah,4ch
int 21h

show proc near
mov ah, 9
mov dx,switcher    ; смещение строки
int 21h            ; вывод строки
ret
show endp
    end begin

[/more]
Автор: akaGM
Дата сообщения: 13.05.2011 12:30
SERIOUS2
в первой всё ок, за исключением того, что "дальнюю" по-дальнему и вызывать надо...
при такой-то модели

.model small
...
call far ptr show

с третьей всё в порядке
будет время, гляну вторую...
Автор: akaGM
Дата сообщения: 13.05.2011 15:07
---
а ведь это не ты писал?
с такими комментариями, не должно быть никаких проблем в написании таких простых задач...
сам разбирайся...
Автор: SERIOUS2
Дата сообщения: 13.05.2011 18:45
akaGM
Уже зачли эти кр, и я их сдирал с лекций, на удивление прокатило
Автор: OldGopher
Дата сообщения: 16.05.2011 12:38
Мне интересно было, что подразумевается под "переслать"?
По сети переслать, моделируя некий протокол?

Сорри, что давно не был на форуме, личные проблемы.
Автор: praidik
Дата сообщения: 16.05.2011 17:39
Здравствуйте.
Помогите пожалуйста...

Model small
Stack 256
dataseg
mas db 1,2,3,4,5,6,7,8,9
codeseg
Start:
mov dl,mas
mov cx,8
mov bx,1
cont: cmp dl,mas[bx]
jg next
mov dl,mas[bx]
next: inc bx
loop cont
mov ax,4c00h
mov ah, mas
Mov ah, 09h
int 21h
end start

Не хочет выводить минимальный элемент массива, в чём проблема?
Автор: akaGM
Дата сообщения: 17.05.2011 01:11
praidik
mov ax,4c00h
mov ah, mas
Mov ah, 09h

ну для начала что ты этим хотел сказать, выйти? вывести? что?
Автор: tsknv
Дата сообщения: 19.05.2011 04:11
Я в ступоре, где-то что-то не по глазам?
Решил вспомнить ассемблер, FASM 1.69.31
простейший код :

use16
org 100h
mov eax,12345678h
mov ebx,07654321h
add eax,ebx
int 20h

выполняю под ms-dos 6.22 в отладчике CodeView 4.01
открываю com файл в отладчике
жму f10
смотрю eax=12345678, ok
жму f10 второй раз
смотрю eax=60005678 ??!! Какого спрашивается х.. старшие 2 байта eax стали 6000?
c ebx все в порядке ebx=07654321

Вчера полдня на эти три строчки кода смотрел, ничего не понимаю, почему когда выполняется иструкция mov ebx,07654321h изменяется регистр eax !!?? Чудеса прямо какие-то, или у меня с головой чего-то не того ?
Автор: akaGM
Дата сообщения: 21.05.2011 21:29
tsknv
Цитата:
CodeView 4.01

а это не очень протухший отладчик?

Цитата:
mov eax,12345678h
mov ebx,07654321h

я не проверял, честно скажу, но это два (чего-то там 2^32-1) гигабайта не превышает?
и потом...
FASM
альтруисты пишут, чё б им не ошибиться...
Автор: Abs62
Дата сообщения: 21.05.2011 21:39
Хм. А откуда вообще eax и ebx в 16-битном коде?
Автор: Ekaterina666
Дата сообщения: 22.05.2011 21:03
помогите пожалуйста с поиском ошибки в программе

условие:
Дан массив из 8 байт. Рассматривая его, как массив из 64 бит, посчитать количество пар единиц в окружении нулей. Конец последовательности рассматривать как нуль



data segment
tick1 dw ?
tick2 dw ?
mass db 10101010b,11111111b,010000000b, 10110001b, 01101100b, 01101101b, 11110101b, 10110000b
data ends
code segment
assume cs:code,ds:data
start:
mov ax,data
mov ds,ax
mov dx,2
mov tick1,dx
lea bx, mass
mov cx, 3
beg: mov al,[bx]

M3:
test al,00000001b ; проверяем установлен ли 0-й бит
jnz M1 ; если нет то к М1
inc tick1 ;да увеличиваем счетчик для 0
shr al,1 ;сдвигаем биты
inc tick2; увеличиваем счетчик битов
cmp tick2,8 ;если он равен 8-ми загружаем след байт
je m4
jmp M3
M1: cmp tick1,1 ;
jne M2 ; если счетчик не подходит то к М2
mov tick1,0 ;подходит обнуляем его
inc si ; увеличиваем счетчик совпадений 010
M2: mov tick1,0
shr al,1
inc tick2
cmp tick2,8
je m4
jmp M3
M4: mov tick2,0
add bx,1

loop beg

mov ax,4c00h
int 21h
code ends
end start
Автор: akaGM
Дата сообщения: 23.05.2011 01:27
Ekaterina666
первая ошибка скорее логическая:

tick2 dw ?
...
inc tick2; увеличиваем счетчик битов

не инициализируешь переменную перед использованием, т.е. tick2 перед входом в цикл имеет "мусорное значение"...
пиши уж тогда всегда хоть так:
tick2 dw 0
и почему, кстати, в начале tick1 = 2?

и вот здесь тоже логика страдает

Код: M1: cmp tick1,1 ;
jne M2 ; если счетчик не подходит то к М2 ;зачем этот отскок на M2
mov tick1,0 ;подходит обнуляем его ;если здесь стоит тот же самый mov tick1,0 ?
inc si ; увеличиваем счетчик совпадений 010
M2: mov tick1,0
Автор: praidik
Дата сообщения: 24.05.2011 16:27
Дайте пожалуйста не большой пример задачи которая переходит на какую либо метку при нажатии клавиши "1" Мне дали делать лабораторную... но даже не подумали объяснить что и как делается
Буду очень благодарен! Я по примеру доделаю свою задачу...
Автор: akaGM
Дата сообщения: 24.05.2011 17:24
praidik
читать клаву можно тремя способами: при помощи 60-ого порта, 9-bios-функции или 21-ого дос прерывания, (что проще всего)

Код: mov ah, 1
int 21h
cmp al, '1'
je __1
cmp al, '2'
je __2

...

_1:
что-то делаем...
jmp __exit

_2:
что-то делаем...
jmp __exit


__exit:
завершение...
Автор: praidik
Дата сообщения: 25.05.2011 13:44
akaGM
Спасибо, очень помогло!
Автор: MERCURY127
Дата сообщения: 25.05.2011 15:29
Ого!!! и как я эту тему проглядел... добавил в закладки...
bomzzz
а тут ещё и старые знакомые сидят!

Добавлено:
akaGM

Цитата:
читать клаву можно тремя способами: при помощи 60-ого порта, 9-bios-функции или 21-ого дос прерывания, (что проще всего)

int 16h ah=10h ещё вроде есть
Автор: akaGM
Дата сообщения: 25.05.2011 15:51
MERCURY127

Цитата:
int 16h ah=10h ещё вроде есть

да, конечно же, ты прав, именно 16-ое...
я имел в виду биос, а не интеррапт
ошибся номером 9 -- 16
Автор: praidik
Дата сообщения: 28.05.2011 11:44
Доброго всем времени суток.

Помогите пожалуйста...
Есть код

Model small
Stack 1024
Dataseg
Msg db 13,10,13,10,('You really want ends programm? y/n $')
Msg2 db 13,10,('Choys for contine... $')
Msg3 db 13,10,13,10,('Press A "+" two nambers $')
Msg4 db 13,10,('Press B "*" two nambers $')
Msg5 db 13,10,('Press C "-" two nambers $')
Msg6 db 13,10,('Press D "/" two nambers $')
Msg7 db 13,10,('Choys: $')
Msg8 db 13,10,13,10,('Thanks for using our program... $')
Msg9 db 13,10,('OTBET: $')
numb1 dw 4
numb2 dw 5
codeseg

Start:
Mov ax,@data
Mov ds,ax

jmp question

question:
mov ah, msg
Mov dx, offset msg
Mov ah, 09h
Int 21h
mov ah, msg7
Mov dx, offset msg7
Mov ah, 09h
Int 21h
Mov ah, 1h
int 21h
cmp al, 'y'
je close
cmp al, 'n'
je menu
call close

menu:
mov ah, msg2
Mov dx, offset msg2
Mov ah, 09h
Int 21h
mov ah, msg3
Mov dx, offset msg3
Mov ah, 09h
Int 21h
mov ah, msg4
Mov dx, offset msg4
Mov ah, 09h
Int 21h
mov ah, msg5
Mov dx, offset msg5
Mov ah, 09h
Int 21h
mov ah, msg6
Mov dx, offset msg6
Mov ah, 09h
Int 21h
mov ah, msg7
Mov dx, offset msg7
Mov ah, 09h
Int 21h

mov ah, 1
int 21h
cmp al, 'a'
je slozh ;Сложение
cmp al, 'b'
je umnozh ;Умножение
;cmp al, 'c'
;je minus ; Вычитание
;cmp al, 'd'
;je delenie ; Деление

umnozh: ;Умножение

Int 21h

jmp question

slozh: ;Сложение
mov ax, word ptr numb1
mov bx, word ptr numb2
add ax, bx
aaa
xchg al,ah
add ah, '0'
int 29h
mov al,ah
int 29h
Mov ah, 1h
Int 21h

jmp question

minus: ; Вычитание

Int 21h

jmp question

delenie: ; Деление
Int 21h

jmp question

Close:
mov ah, msg8
Mov dx, offset msg8
Mov ah, 09h
Int 21h
mov ah,0
int 16h
End start

При попытке добавить например вывод переменной, при компиляции выдаёт ошибку, выход за пределы памяти... Из-за этого я не могу закончить программу...
Хотелось бы найти и справить ошибку...
Автор: akaGM
Дата сообщения: 28.05.2011 13:11
praidik
вообще-то неплохо спросить у того, кто это писал:
например, где метка question? и что такое
Цитата:
добавить например вывод переменной


кстати, строки на вывод для 9/21h обычно завершают $ вот так:
Msg db 13,10,13,10, 'You really want ends programm? y/n', '$'

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384

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


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