Assembly language je jump function

Моя цель в этом вопросе состояла в том, чтобы заблокировать файл, используемый в качестве хранилища данных для нескольких сценариев. В конце я привык подобный код для следующего (от 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);
16
задан Brian Tompsett - 汤莱恩 23 June 2015 в 20:05
поделиться

4 ответа

Допустим, вы хотите проверить, равно ли 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 ...
20
ответ дан 30 November 2019 в 16:05
поделиться

Обычно перед 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
2
ответ дан 30 November 2019 в 16:05
поделиться

Итак, я наконец нашел свой ответ. : P Обычно вы вызываете je label_to_jump_to после вызова cmp.

Если cmp показывает, что два значения равны, je перейдет к указанной метке. В противном случае выполнение будет продолжаться.

1
ответ дан 30 November 2019 в 16:05
поделиться

Перескакивает, если установлен «флаг равенства» (также известный как «нулевой флаг») в регистре 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".
13
ответ дан 30 November 2019 в 16:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: