Помощь - Поиск - Пользователи - Календарь
Полная версия: Работа с com-портом
Форум «Всё о Паскале» > Современный Паскаль и другие языки > Ассемблер
Rocket
Всем привет! smile.gif По заданию, мне нужно передать системное время,а затем установить в принимающей машине новое системное время, равное переданному.
Нашёл функции по взятию и установки системного времени: 2cH и 2dH, соответственно...
Вот как я их использую:

data segment

h db ?
m db ?
s db ?
ms db ?

data ends

code segment
assume cs:code, ds:data

GetTime proc

push ax
push cx
push dx

xor ax,ax
xor cx,cx
xor dx,dx

mov ah, 2ch
int 21h

mov h, ch
mov m, cl
mov s, dh
mov ms,dl

pop dx
pop cx
pop ax
ret
GetTime endp

SetTime proc

push ax
push cx
push dx

xor ax,ax
xor cx,cx
xor dx,dx

mov ch, 11h
mov cl, 0
mov dh, 0
mov dl, 0

mov ah, 2dh
int 21h


pop dx
pop cx
pop ax
ret
SetTime endp

start:
mov ax, data
mov ds, ax

call GetTime
call SetTime
;call GetTime

fin: mov ax, 4c00h
int 21h

code ends
end start


Почему не происходит установка нового времени?
volvo
Цитата
Почему не происходит установка нового времени?
происходит... Время устанавливается, и сохраняется, пока твоя программа работает. Можешь проверить: напиши процедуру, печатающую текущее время, измени время, и распечатай его...

Если ты хочешь, чтобы был постоянный эффект - запускай программу под ДОС, а не под Windows. И, кстати, проверяй регистр AL после установки времени, только в случае если AL = 0 операция завершилась корректно.
Rocket
Цитата(volvo @ 27.03.2009 22:21) *

происходит... Время устанавливается, и сохраняется, пока твоя программа работает. Можешь проверить: напиши процедуру, печатающую текущее время, измени время, и распечатай его...

Если ты хочешь, чтобы был постоянный эффект - запускай программу под ДОС, а не под Windows. И, кстати, проверяй регистр AL после установки времени, только в случае если AL = 0 операция завершилась корректно.

А чтобы в Windows время поменялось, что нужно сделать? И как вообще программу под ДОС запустить?
volvo
Цитата
А чтобы в Windows время поменялось, что нужно сделать?
Работать с ассемблером для Windows и для смены времени вызывать API-функцию SetLocalTime...

Цитата
И как вообще программу под ДОС запустить?
Загрузиться с ДОС-овской дискеты и запустить...
Rocket
Написал программы для передающей машины (out1.txt) и принимаюшей (inp1.txt).
Как реализовать следующие моменты:

1.

;передающая машина

call GetTime

mov cx,4

mm: add dx,5
mm1: in al,dx
and al, 01100000b
cmp al, 01100000b
jnz mm1
;в al записать очередной символ
sub dx,5
out dx,al
loop mm


То есть, как часы, минуты, сек и мсек отправить?

2.

;принимающая машина
mov cx,4

mm: add dx,5
mm1: in al,dx
test al,00000001b
jz mm1
sub dx,5
in al,dx
;сохранить этот символ
loop mm

call SetTime


Как вообщем эти переменные принять и сохранить?


volvo
Цитата
как часы, минуты, сек и мсек отправить?

Цитата
Как вообщем эти переменные принять и сохранить?
Вот тут лежит документ, в котором мало того, что описаны порты, так еще и приведены подпрограммы инициализации/сброса и приема/передачи данных:
http://kwp2000.boom.ru/old/koc.txt

Разбирайся...
Rocket
Цитата(volvo @ 28.03.2009 20:53) *

Вот тут лежит документ, в котором мало того, что описаны порты, так еще и приведены подпрограммы инициализации/сброса и приема/передачи данных:
http://kwp2000.boom.ru/old/koc.txt

Разбирайся...

Да у меня в принципе тоже есть материал по портам, но всё равно лишним не будет.

Вот что у меня получилось, опять же, для передающей машины (out1.txt) и принимающей (inp1.txt).
Если есть возможность, наличие двух портов, то протестируйте пожалуйста...уж очень интересно узнать результат моей работы smile.gif
Rocket
Цитата(volvo @ 28.03.2009 1:23) *

Работать с ассемблером для Windows и для смены времени вызывать API-функцию SetLocalTime...

Загрузиться с ДОС-овской дискеты и запустить...

Пишу туже самую программу, но только с использование Api-функций... SetLocalTime также не изменяет время
в Windows. С чем это связано?
volvo
Цитата
SetLocalTime также не изменяет время в Windows. С чем это связано?
У меня изменяет... Привилегию SeSystemTimePrivilege разрешил для текущего процесса?
Rocket
Цитата(volvo @ 1.04.2009 0:33) *

У меня изменяет... Привилегию SeSystemTimePrivilege разрешил для текущего процесса?

Нет. Как это сделать?
volvo
Вот программа, меняющая системное время:
.386
.model flat, stdcall
option casemap :none

include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
include \masm32\include\advapi32.inc

includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\advapi32.lib

EnablePrivilege proto :DWORD, :DWORD

.data
szTimePriv db "SeSystemTimePrivilege", 0
time SYSTEMTIME <0>

.code
start:

invoke GetCurrentProcess
invoke EnablePrivilege, eax, ADDR szTimePriv
or eax,eax
jz _exit
;
invoke GetLocalTime,ADDR time
mov si,time.wHour
mov time.wHour,10
invoke SetLocalTime,ADDR time
;
_exit:
invoke ExitProcess,0

EnablePrivilege proc hProcess: DWORD, szPrivilegeName: DWORD
LOCAL hToken: DWORD
LOCAL tpNew: TOKEN_PRIVILEGES

invoke OpenProcessToken, hProcess, TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, ADDR hToken
.IF eax
invoke LookupPrivilegeValue, 0, szPrivilegeName, ADDR tpNew.Privileges[0].Luid
.IF eax
mov tpNew.PrivilegeCount, 1
mov tpNew.Privileges[0].Attributes, SE_PRIVILEGE_ENABLED
invoke AdjustTokenPrivileges, hToken, 0, ADDR tpNew, 0, 0, 0
.ENDIF
.ENDIF
ret
EnablePrivilege endp

end start

(masm32)
Rocket
Добрый вечер! smile.gif Сегодня я тестировал программу (передача системного времени через COM порт, написанная на ассемблере)...Но что-то как-то не особо удачно, вобщем время не передалось...
Это код программы для передающей машины:

data segment

h db ?,?,?,?

mesmen db 13,10,"Choose COM-X :",13,10,13,10,"COM-1 pressed(1)",13,10,"COM-2 pressed(2)",13,10,"COM-3 pressed(3)",13,10,"COM-4 pressed(4)",13,10,"$"

mes1 db 13,10,"COM-1 is active!!!",13,10,"$"
mes2 db 13,10,"COM-2 is active!!!",13,10,"$"
mes3 db 13,10,"COM-3 is active!!!",13,10,"$"
mes4 db 13,10,"COM-4 is active!!!",13,10,"$"


data ends

code segment
assume cs:code, ds:data

clrscn proc

push ax
push bx
push ds
push es

mov cl, 0
mov ch, 0
mov dl, 80
mov dh, 25

xor ax,ax
mov al,0

xor bx, bx
mov bh, 10

int 10h

pop es
pop ds
pop bx
pop ax

ret

clrscn endp


GetTime proc

push ax
push cx
push dx

xor ax,ax
xor cx,cx
xor dx,dx

mov ah, 2ch
int 21h

mov h, ch
mov h+1, cl
mov h+2, dh
mov h+3, dl

pop dx
pop cx
pop ax
ret
GetTime endp

start:
mov ax, data
mov ds, ax

met:
call clrscn

mov ah, 09h
mov dx,offset mesmen
int 21h

mov ah,01h
int 21h

cmp al,'1'
jz m1
cmp al,'2'
jz m2
cmp al,'3'
jz m3
cmp al,'4'
jz m4
jmp met


m1:
call clrscn

mov ah, 09h
mov dx,offset mes1
int 21h

mov ax,0040h
mov es, ax
mov ds, es:[0000]
jmp beg

m2: call clrscn

mov ah, 09h
mov dx,offset mes2
int 21h

mov ax,0040h
mov es, ax
mov ds, es:[0002]
jmp beg

m3: call clrscn

mov ah, 09h
mov dx,offset mes3
int 21h

mov ax,0040h
mov es, ax
mov ds, es:[0004]
jmp beg

m4: call clrscn

mov ah, 09h
mov dx,offset mes4
int 21h

mov ax,0040h
mov es, ax
mov ds, es:[0006]

beg: add dx,3
mov al, 10000000b
out dx,al
nop
nop
mov ax,417h
sub dx,3
out dx,al
nop
nop
inc dx
mov al,ah
out dx,al
nop
nop
;установка протокола
inc dx
inc dx
mov al,00011111b
out dx, al
nop
nop
sub dx,3

;передающая машина

call GetTime

mov cx,4
mov si,0

mm: add dx,5
mm1: in al,dx
and al, 01100000b
cmp al, 01100000b
jnz mm1

;в al записать очередной символ

mov al,h+si
inc si

sub dx,5
out dx,al
loop mm


fin: mov ax, 4c00h
int 21h

code ends
end start


При запуске ехе-шник какбы виснит. Что не так в коде, какие будут замечания и поправки? подскажите пожалуйста yes2.gif
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.