Go назад после прыжка - PullRequest
       96

Go назад после прыжка

1 голос
/ 04 августа 2020

У меня есть этот код, мне нужно проверить RCX регистр три раза. Я сделал несколько строк кода (24-34 строки). В первый раз (сначала jz) я перехожу к метке true:, но после того, как я не могу go вернуться и проверить его во второй раз (28-30 строк). Моя программа просто заканчивает sh каждый раз после первого jz. Как я могу go вернуться и трижды проверить?

default REL
extern GetStdHandle
extern WriteFile
extern ExitProcess


section .data
    true_msg db 'Yes', 0

    true_msg_len equ $-true_msg

section .text
    global _main

_main:
    and rsp, -10h
    sub rsp, 020h

    mov rcx, -0Bh
    call GetStdHandle

    ;jmp true

    mov rcx, 2
    cmp rcx, 2
    jz true

    mov rcx, 0
    cmp rcx, 0
    jz true
    
    mov rcx, 1
    cmp rcx, 0
    jz true

;----------------
    add rsp, 28h                            ; Restore Stack Pointer
;----------------
    mov rcx, 0                              ; RCX - first argument.
    call ExitProcess
;----------------
    xor rax, rax
    ret

true:
    mov rcx, rax
    mov rdx, true_msg
    mov r8, true_msg_len
    xor r9, r9
    push r9
    sub rsp, 20h
    call WriteFile

Я хочу получить что-то вроде:

if(...){
   ...
}

if(...){
   ...
}

if(...){
   ...
}

Мне нужно проверить все условия.

1 Ответ

3 голосов
/ 06 августа 2020

Существует неправильное понимание того, как это выполнить. Простым способом:

if (test) {
   //block1
}
if (test2) {
   //block2
}
if(test3) {
   //block3
}

(Обратите внимание, где эти block1, block2 и block3 появятся в моем следующем примере)

Каждый, если нужно проверить (тест в скобках) и затем либо go и выполните возможность, что это правда, и возможность, что это не правда. Это будет примерно так:

;first if, start by comparing:
   mov rcx, 2
   cmp rcx, 2
   jnz false1 ;jumps for the false possibility of the first if

   ;here you type what will happen when the first if is executed (block1)

false1: ;here the first if is finnished, this label is the jump for not executing that first if

   ;then now you execute the second if:

   ;first compare:
   mov rcx, 0
   cmp rcx, 0
   jnz false2 ;jumps for not executing the if block

   ;here is block2

false2:

   ;now here the last if, just like the last two:

   mov rcx, 1
   cmp rcx, 0
   jnz false3

   ;here block3

false3:
   ;here is the rest of your code after those ifs

Я изменил logi c для перехода в ложную возможность вместо истины (как вы), потому что в случаях, когда нет блока «else», он делает код меньше, чем вы.

...