【问题标题】:display message many time in Assembly language用汇编语言多次显示消息
【发布时间】:2017-03-12 09:22:51
【问题描述】:

我正在尝试多次显示一条消息。

我使用了 nasm,我使用了这个程序:

    MOV cx, 1
    mov  ax, 10
re:
    CMP ax, cx
    JS fin
    mov  dx, texte 
    INC cx
    JMP re
fin:
    Int 21h
    texte: db 'Hello, World !!'

【问题讨论】:

  • 有什么问题? (另外,您似乎没有在初始化 ax)
  • 问题 tnis 代码不显示消息 Hello, World !! 10次​​

标签: loops assembly x86 nasm dos


【解决方案1】:

加上更多的东西:

  • int21h 要执行输出,需要将 AH 设置为 9。您已经在使用 AX 来存储循环限制;您必须使用其他一些寄存器(BX、SI、DI 当前未使用)或硬编码限制。此外,int21h 函数 9 在输出时更改了 AL 的值 - 另一个不使用 AX 的原因。
  • 字符串需要以 $ 字符结尾。这是 int21h/9 所期望的,而不是一般的汇编语言约定。
  • 而且,正如 obe 所说,您需要 int 21h 命令之前,而不是“jmp re”行之后。
  • 在“fin”标签处,您可能想退出程序。其顺序是:“mov ah, 4ch/int 21h”。

【讨论】:

  • 或者将 CX 从 10 倒数,而不是使用两个寄存器从 1 循环到 10。或者将 10 作为 CMP 的立即操作数。 SI 和 DI 也未使用,IDK 你为什么提到 BX 而不是它们。
  • 有很多方法可以做到这一点。 “LOOP re”命令可能是最简单的。
  • 除了LOOP is slow,而且不是教初学者的好习惯。他们在查看编译器输出时找不到使用它的真实代码,因此不妨学习使用 cmp/jcc(或 dec/jnz)创建循环。首先从不提及 LOOP 会更简单,因为除了优化代码大小之外它没有用处。
【解决方案2】:

目前您仅在底部调用int 21h。 尝试将其移入循环中。

另外,自从我上次在汇编中做任何事情以来已经很长时间了,但您可能还需要准备一些寄存器来确定 int 21h 会做什么。在此处查看更多信息:http://spike.scu.edu.au/~barry/interrupts.html#ah09

【讨论】:

  • 我更改了它并使用了 nasm 命令但没有显示消息。
  • 请不要更改问题中的代码。相反,请在下面附加更新的代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-03-19
  • 1970-01-01
  • 1970-01-01
  • 2012-01-08
  • 1970-01-01
  • 2022-10-18
  • 2010-12-24
相关资源
最近更新 更多