Помощь - Поиск - Пользователи - Календарь
Полная версия: Работа с com-портом
Форум «Всё о Паскале» > Delphi, Assembler и другие языки. > Assembler
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
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.