我有这个代码,我需要检查RCX
寄存器三次。我编写了几行代码(24-34行(。在第一次(第一个jz
(中,我移动到true:
标签,但之后我无法返回并检查第二次(28-30行(。我的程序每次都是在第一个jz
之后完成的。我怎样才能回去检查三次?
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(...){
...
}
我需要检查每一种情况。
关于如何执行此操作存在误解。简单来说:
if (test) {
//block1
}
if (test2) {
//block2
}
if(test3) {
//block3
}
(注意区块1、区块2和区块3将在我的下一个示例中出现的位置(
每一个if都需要测试(测试为父子关系(,然后去执行它是真的可能性和它不是真的可能性。所以它应该是这样的:
;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
我改变了在假可能性而不是真可能性中跳跃的逻辑(就像你所做的那样(,因为在没有"可能性"的情况下;否则";块,它使代码比您所做的方式更小。