【问题标题】:Loop statement in assembly error汇编错误中的循环语句
【发布时间】:2013-12-11 16:20:11
【问题描述】:

我已经构建了一个汇编程序,当我尝试循环一个标签、编译(0 个错误)并执行时,我得到了这个错误:

    ntvdm cpu has encountered an illegal instruction

所以我将代码删除到标签中,但我仍然收到该错误! 如果我删除循环语句,程序就会工作

循环语句不是下面的语法吗?

    mov  cx,5
    loop foo
    ;execute foo  5 times

【问题讨论】:

  • foo: 在循环语句下
  • 如果我没记错的话应该是之前(例如stackoverflow.com/questions/5849606/tasm-embedded-loops)。
  • 好的,谢谢..但能走多远?还有一件事……一定是在cx赋值和循环语句之间?
  • 发布的答案应该会告诉你。我不知道您所说的“能走多远”是什么意思-我真的不知道装配线的距离会对此产生多大影响,但如果我错了,我会很感激纠正。
  • @SubSevn:这确实很重要(间接地),因为目标地址表示为相对于当前指令指针的带符号的 8 位偏移量。这允许在 -128..127 范围内的偏移量。

标签: assembly x86-16 tasm


【解决方案1】:

“foo”在哪里?

应该是这样的:

mov cx,5
foo:
;do stuff
loop foo

【讨论】:

  • foo: 在循环语句下
  • 那是你的问题。这不是它的工作原理。 :-)
  • loop 转发是完全可能的,尽管这不是最常见的情况。
【解决方案2】:

循环的替代方法是jmp 语句,它有多种类型,例如:je、jg、jnz、jz 等。

mov cx,5;let you want to loop 5 time, move 5 in cx
jmp foo; jumping to foo

;some stuff if you want

foo:

     ;do some thing you want

dec cx;decrease cx by 1
jnz foo; jump to foo if value of cx is not zero

;当值为零时,循环将结束,循环后你想做的任何事情都会来到这里

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-02-13
    • 1970-01-01
    • 2016-03-07
    • 1970-01-01
    • 2012-01-08
    • 2019-01-07
    • 1970-01-01
    相关资源
    最近更新 更多