Assembly 而在x86-64程序集中

Assembly 而在x86-64程序集中,assembly,Assembly,我正在尝试创建一个汇编程序,它应该只检查m>n,并给出一个文本或增加一个num section .data numb: db "Enter a number: " section .bss section .text global _start: _start: mov rax, 4 mov rbx, 1 mov rcx, 5 cmp rdx, 7 ja 编辑 section

我正在尝试创建一个汇编程序,它应该只检查m>n,并给出一个文本或增加一个num

section .data
        numb: db "Enter a number: "

section .bss

section .text

        global _start:
_start:
        mov rax, 4
        mov rbx, 1
        mov rcx, 5
        cmp rdx, 7
        ja
编辑

section .data
        numb: db "Enter a number: "

section .bss

section .text

        global _start:
_start:
        mov rax, 4
        mov rbx, 1
        mov rcx, numb
        cmp rcx, 7
        ja
我使用64位寄存器。但我不知道这是怎么可能的,因为汇编程序没有while语句,所以我们必须使用cmp并跳到上面,但现在卡在这里

c++

int m = 10;
int n = 1;

while (m > n) {
  n++;
}
变成

    mov rax, 10     ' m
    mov rbx, 1      ' n

start_loop:

    cmp rax, rbx    ' Compare m and n
    jle exit_loop   ' Conditional jump on <= which is the same as !>
    add rbx, 1      ' Body
    jmp start_loop  ' Unconditional jump

exit_loop:
mov-rax,10'米
mov rbx,1'n
开始循环:
cmp-rax,rbx'比较m和n
jle exit_循环“条件跳转打开”
添加rbx,1'阀体
jmp启动循环“无条件跳转”
退出循环:

跳跃之间的一切都是while身体。棘手的一点是将>更改为jle。这是因为我们希望在while条件失败时执行条件跳转,而不是在它通过时。因此,它不是变成jg而是变成jle。当while条件没有通过时,我们就跳了

while有两种常见模式

loopheader:
  some test
  jcc exit
  body
  jmp loopheader
exit:
哪一个是最明显的

  jmp loopentry
looptop:
  body
loopentry:
  some test
  jcc looptop

每次迭代只有一次跳转(不过每次迭代都只有一次跳转)。它可以被看作是两个条件共享相同代码的循环。

您可能认为
循环是
begin:if(!condition)goto end;做事;去开始;结束:
。在装配中实现这一点应该是直截了当的。如果您不确定指令的作用,请在中查找。@Michael o您的意思是我可以在汇编程序中使用If语句吗?不,您可以在x86汇编程序中使用条件跳转(可能前面有一个
cmp
)。我只是以一种与汇编代码的结构非常接近的方式展示了逻辑。@Michael我认为它的cmp-rax,rbx如果cmp=True,那么就这样做……@Michael-hmm好的,我会试试:)你解释得很好,现在我明白了它是如何工作的,但我得到了一个内存访问错误确切地说是哪一行给了你一个内存访问错误?没有任何一行,只有一个文本打印出来,我给了一个“内存访问错误”,我删除了一条消息,如果它更大,应该打印出来,但在那之后,我得到了相同的错误使用你的调试器一次一行通过。当错误出现时,请注意您在哪一行。如果这条线不是这个循环的一部分,你将不得不打开另一个问题。