【问题标题】:x86 Assembly (How to display Counter?)x86 程序集(如何显示计数器?)
【发布时间】:2014-11-11 11:30:10
【问题描述】:

此代码的目的是显示标题“hello World”,其下方有一个数值,表示使用 INC 计数器的次数。如果你运行这个代码,在 MS DOS 中字符串会显示在它下面的字母 K(我需要一个数字)。附带说明一下,寄存器 D 不能使用,我分配的内存位置是 899。所以基本上我只需要帮助弄清楚为什么每次运行程序时我都会收到一个字母(或其他一些随机字符)而不是数字.我认为我的问题是在第一个 INT 21 之后,但我不是 100% 确定。我希望对此有一些意见,如果可能的话,可能会进行更正。这是我的代码:

debug
a100
MOV cL, 02
MOV AL, [0899]
MOV BL, [0900]
SUB AL, BL
MOV BL, 0
JGE 115
INC BL
ADD AL, CL
JMP 10D
MOV [0899], AL
MOV DX, 054B
MOV AH, 09
INT 21
ADD BL, 30
MOV CL, BL
MOV AH, 02
INT 21
INT 20

e 054B "Hello World" 0d 0a "$"

g=100

【问题讨论】:

  • 您希望打印什么?加 30h 得到一个数字的方法只适用于个位数(即 0..9)。如果您的数字 >= 10,则需要反复除以 10 并输出余数 + 30h。

标签: assembly x86 masm dos


【解决方案1】:

INT 21 FN 02 需要寄存器 DL 中的 ASCII 字符(不是 BL 或 CL)。 DL 使用 MOV DX, 054B 设置为 4Bh,即“K”的 ASCII 码。

我建议Ralf Brown's Interrupt List 检查INT 21h 的正确使用。 INT 21 FN 02 的描述可以在“Int 21/AH=02h”下找到。

顺便说一句:考虑到 DEBUG.EXE 中的每个数字都是十六进制的! 0899 是十进制的 2201,0900 是十进制的 2304,在 0899 之后是 089A(不是 0900)。

我不知道 [0899] 和 [0900] 的初始值,怀疑没有。你可以像“Hello...”-string一样初始化它:

e 899 5
e 900 10

【讨论】:

  • 那么哪个中断最有用?我可以将寄存器 BL 移动到 CL 以外的另一个寄存器中,但是如果我将 MOV CL、BL 更改为 MOV DL、BL,我只会得到另一个字符。我检查了你的链接,但我不确定我应该使用哪种形式的 INT 21h,因为我刚开始使用汇编语言。
  • @alex786:看看我升级后的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-06
  • 2017-04-17
  • 1970-01-01
相关资源
最近更新 更多