【问题标题】:Jump if equal x86 assembly如果相等 x86 程序集则跳转
【发布时间】:2014-06-28 08:58:23
【问题描述】:
    mov answ, 11
    lea bx, answ    ;scanf
    mov ah, 0ah
    int 21h


    cmp [bx], 79h
    JE L1

我不明白为什么即使我输入 'y' 也不会跳转到 L1,请帮助我,我是 x86 汇编编程的新手。

【问题讨论】:

  • 我想我会指出一些关于您的代码的事情:因为cmp mem,imm 是模棱两可的,所以写cmp byte [dx], 79hcmp byte ptr [dx],79h 是一个好主意,具体取决于所使用的汇编程序。此外,任何体面的汇编程序都应该支持使用'y' 作为立即数而不是79h,并使代码更加清晰。
  • 在 x86 上,16 位寄存器 dx、cx 和 ax 不能用作括号[]之间的地址寄存器。只有 bx、si、di、bp 和 sp 以及 386+ 上的所有 32 位寄存器。
  • 有用的指令是: "cmp byte[bx],79h" "cmp byte[si],79h" or "cmp byte[di],79h" ;将字节与 DS:BX、DS:SI 或 DS:DI 进行比较

标签: assembly x86 ascii


【解决方案1】:

0ah 指令在 DS:DX 处接受缓冲区,并用输入的字符填充它。所以你可能需要

lea dx, answ
...
cmp [dx], 79h

此外,缓冲区会填充其长度和其他信息,如果您只需要读取一个字符 - 使用 07h - 直接输入字符而不回显。 char 将被放入 AL 中

http://spike.scu.edu.au/~barry/interrupts.html#ah0a

【讨论】:

  • 我尝试使用 lea dx,answ cmp[dx],79h 但它不起作用。 Emu 8086 说它可能是一个未定义的 var,但是这样做 cmp answ[2] 似乎有效,你能向我解释一下吗?如果你知道为什么
  • 哦,没错。 cmp 比较字,要与字节比较,您可能需要 cmpb。根据规范, answ[2] 保存输入字符串的第一个字节。 answ[0] 保存缓冲区的大小,而 answ[1] 是实际存储在缓冲区中的字符数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-07
  • 1970-01-01
  • 1970-01-01
  • 2019-07-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多