Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 如何退出程序集中的循环_Assembly_X86 - Fatal编程技术网

Assembly 如何退出程序集中的循环

Assembly 如何退出程序集中的循环,assembly,x86,Assembly,X86,我有一个带几个条件的循环,这意味着当循环完成时,它将继续通过剩余的循环段。即使ecx已经为0,我如何强制程序跳过剩余的循环段?您必须跳过它们。这是你唯一能得到的流量控制。不过,试着用一种更高级的语言来模拟你将要使用的结构,以避免产生意面式的代码。你必须跳过它们。这是你唯一能得到的流量控制。不过,尝试用更高级的语言模拟您将使用的结构,以避免生成意大利面代码。使用标签、比较和跳转创建循环和条件: xor ecx,ecx ;ECX = 0 mov eax,8

我有一个带几个条件的循环,这意味着当循环完成时,它将继续通过剩余的循环段。即使ecx已经为0,我如何强制程序跳过剩余的循环段?

您必须跳过它们。这是你唯一能得到的流量控制。不过,试着用一种更高级的语言来模拟你将要使用的结构,以避免产生意面式的代码。

你必须跳过它们。这是你唯一能得到的流量控制。不过,尝试用更高级的语言模拟您将使用的结构,以避免生成意大利面代码。

使用标签、比较和跳转创建循环和条件:

xor ecx,ecx                ;ECX = 0
mov eax,8                  ;EAX = 8
mov ebx,4                  ;EBX = 4

START_LOOP:

sub eax,ebx                ;EAX = EAX - EBX
cmp eax,ecx                ;compare EAX and ECX
jne START_LOOP             ;if EAX != ECX, jump back and loop
                           ;When EAX = ECX, execution continues pas the jump

您可以使用我们通常放在ECX中的循环索引循环多次:

xor ecx,ecx                ;ECX = 0
mov eax,2                  ;EAX = 2
mov ebx,2                  ;EBX = 2

START_LOOP:

add eax,ebx                ;EAX = EAX + EBX
inc ecx                    ;ECX = ECX + 1
cmp ecx,5                  ;compare ECX and 5
jne START_LOOP             ;if ECX != 5 jump back and loop
                           ;When ECX == 5, execution continues pas the jump

最后,可以使用不同的标签在循环内使用条件:

xor ecx,ecx                ;ECX = 0
mov eax,2                  ;EAX = 2
xor ebx,ebx                ;EBX = 0

START_LOOP:

cmp eax,ebx               ;compare EAX and EBX
jle CONTINUE              ;if EAX <= EBX jump to the CONTINUE label
inc ebx                   ;else EBX = EBX + 1
jmp START_LOOP            ;JUMP back to the start (until EBX>=EAX)
                          ;You'll never get past this jump until the condition in reached

CONTINUE:
add eax,ebx                ;EAX = EAX + EBX
inc ecx                    ;ECX = ECX + 1
cmp ecx,5                  ;compare ECX and 5
jne START_LOOP             ;if ECX != 5 jump back and loop
                           ;When ECX == 5, execution continues pas the jump
xor-ecx,ecx;ECX=0
mov-eax,2;EAX=2
异或ebx,ebx;EBX=0
开始循环:
cmp-eax,ebx;比较EAX和EBX
jle继续;如果EAX=EAX)
;在达到条件之前,你永远无法通过这次跳跃
继续:
添加eax、ebx;EAX=EAX+EBX
ecx公司;ECX=ECX+1
cmp-ecx,5;比较ECX和5
jne启动循环;如果ECX!=5.向后跳回圈
;当ECX==5时,执行将继续跳转

使用标签、比较和跳转创建循环和条件:

xor ecx,ecx                ;ECX = 0
mov eax,8                  ;EAX = 8
mov ebx,4                  ;EBX = 4

START_LOOP:

sub eax,ebx                ;EAX = EAX - EBX
cmp eax,ecx                ;compare EAX and ECX
jne START_LOOP             ;if EAX != ECX, jump back and loop
                           ;When EAX = ECX, execution continues pas the jump

您可以使用我们通常放在ECX中的循环索引循环多次:

xor ecx,ecx                ;ECX = 0
mov eax,2                  ;EAX = 2
mov ebx,2                  ;EBX = 2

START_LOOP:

add eax,ebx                ;EAX = EAX + EBX
inc ecx                    ;ECX = ECX + 1
cmp ecx,5                  ;compare ECX and 5
jne START_LOOP             ;if ECX != 5 jump back and loop
                           ;When ECX == 5, execution continues pas the jump

最后,可以使用不同的标签在循环内使用条件:

xor ecx,ecx                ;ECX = 0
mov eax,2                  ;EAX = 2
xor ebx,ebx                ;EBX = 0

START_LOOP:

cmp eax,ebx               ;compare EAX and EBX
jle CONTINUE              ;if EAX <= EBX jump to the CONTINUE label
inc ebx                   ;else EBX = EBX + 1
jmp START_LOOP            ;JUMP back to the start (until EBX>=EAX)
                          ;You'll never get past this jump until the condition in reached

CONTINUE:
add eax,ebx                ;EAX = EAX + EBX
inc ecx                    ;ECX = ECX + 1
cmp ecx,5                  ;compare ECX and 5
jne START_LOOP             ;if ECX != 5 jump back and loop
                           ;When ECX == 5, execution continues pas the jump
xor-ecx,ecx;ECX=0
mov-eax,2;EAX=2
异或ebx,ebx;EBX=0
开始循环:
cmp-eax,ebx;比较EAX和EBX
jle继续;如果EAX=EAX)
;在达到条件之前,你永远无法通过这次跳跃
继续:
添加eax、ebx;EAX=EAX+EBX
ecx公司;ECX=ECX+1
cmp-ecx,5;比较ECX和5
jne启动循环;如果ECX!=5.向后跳回圈
;当ECX==5时,执行将继续跳转

你就不能
jmp
跳出循环吗?你就不能
jmp
跳出循环吗?但是,我跳转到什么呢。我做某种标签吗?是的,你在循环后做一个标签,然后跳到它。但是,我跳到什么。我做了某种标签吗?是的,你在循环后做了一个标签并跳到它。值得指出的是,如果结束条件为零,你可以用类似于
dec ecx/jnz TOP\u of_loop
的东西来循环。此外,如果一个循环体可能需要运行零次,那么最好在循环外部进行检查并跳过它,并且仍然使用底部带有
cmp/jcc
的循环。(您的
CONTINUE
循环无效:它有一个not-take条件分支和一个uconditional分支,这两个分支都必须在每次迭代中运行。)值得指出的是,如果结束条件为零,您可以使用类似
dec ecx/jnz TOP_OF_循环的东西进行循环。此外,如果一个循环体可能需要运行零次,那么最好在循环外部进行检查并跳过它,并且仍然使用底部带有
cmp/jcc
的循环。(您的
CONTINUE
循环无效:它有一个not-take条件分支和一个uconditional分支,必须同时运行每个迭代。)