Моя цель в этом вопросе состояла в том, чтобы заблокировать файл, используемый в качестве хранилища данных для нескольких сценариев. В конце я привык подобный код для следующего (от Chris):
open (FILE, '>>', test.dat') ; # open the file
flock FILE, 2; # try to lock the file
# do something with the file here
close(FILE); # close the file
В его примере я удалил ФАЙЛ скопления, 8, поскольку близкое (ФАЙЛ) выполняет это действие также. Настоящая проблема состояла в том, когда сценарий запускается, это должно содержать текущий счетчик, и когда это заканчивается, это должно обновить счетчик. Это - то, где Perl имеет проблему, для чтения файла Вы:
open (FILE, '<', test.dat');
flock FILE, 2;
Теперь я хочу выписать результаты и так как я хочу перезаписать файл, который я должен вновь открыть и усечь который результаты в следующем:
open (FILE, '>', test.dat'); #single arrow truncates double appends
flock FILE, 2;
В этом случае файл на самом деле разблокирован в течение короткого периода времени, в то время как файл вновь открыт. Это демонстрирует случай для внешнего файла блокировки. Если Вы собираетесь быть изменяющимися контекстами файла, используйте файл блокировки. Измененный код:
open (LOCK_FILE, '<', test.dat.lock') or die "Could not obtain lock";
flock LOCK_FILE, 2;
open (FILE, '<', test.dat') or die "Could not open file";
# read file
# ...
open (FILE, '>', test.dat') or die "Could not reopen file";
#write file
close (FILE);
close (LOCK_FILE);
Допустим, вы хотите проверить, равно ли EAX
5
, и выполнить различные действия в зависимости от результата этого сравнения. Другими словами, оператор if.
; ... some code ...
cmp eax, 5
je .if_true
; Code to run if comparison is false goes here.
jmp short .end_if
.if_true:
; Code to run if comparison is true goes here.
.end_if:
; ... some code ...
Обычно перед je
используется cmp
(или тест
или эквивалентный), который обычно устанавливает флаг в регистр EFLAGS. Вот ссылка на простой эхо-сервер в NASM, который может помочь в целом. Не обращайте внимания на надоедливую рекламу Google.
Пример использования je
может быть таким:
cmp eax, ebx
je RET_FAIL
jmp RET_SUCCESS
RET_FAIL:
push 1
pop eax
ret
RET_SUCCESS:
push 0
pop eax
ret
Итак, я наконец нашел свой ответ. : P Обычно вы вызываете je label_to_jump_to после вызова cmp.
Если cmp показывает, что два значения равны, je перейдет к указанной метке. В противном случае выполнение будет продолжаться.
Перескакивает, если установлен «флаг равенства» (также известный как «нулевой флаг») в регистре FLAGS
. Это устанавливается в результате арифметических операций или таких инструкций, как TEST
и CMP
.
Например: (если мне не изменяет память, это правильно: -)
cmp eax, ebx ; Subtract EBX from EAX -- the result is discarded ; but the FLAGS register is set according to the result. je .SomeLabel ; Jump to some label if the result is zero (ie. they are equal). ; This is also the same instruction as "jz".