【问题标题】:int 21h doesn't workint 21h 不起作用
【发布时间】:2015-08-23 20:27:57
【问题描述】:

这段代码应该返回数组'vett'中'ricerca'的位置索引;如果它不存在,它应该返回 -1;

dim equ 8
.model small
.stack
.data
        vett db 1,2,3,4,5,6,7,8
        ricerca db 4
.code
.startup
        mov cx, dim
        mov di, 0
        mov bh, ricerca

lab:    cmp vett[di], bh
        jz lab2

        sub cx, 2
        cmp cx, 0
        jnz lab

        mov byte ptr dl, -1
    jmp fine

lab2:   mov dx, di
    jmp fine
fine:   mov ah, 2
    int 21h

.exit
end

为什么它不在屏幕上打印任何东西?

【问题讨论】:

  • 你是如何组装和运行它的?
  • 除了这里的其他cmets,你应该还有| mov ax,4c00h |诠释 21 小时 |之前|结束 |正确退出程序。

标签: arrays search assembly printing


【解决方案1】:

here 所述,DOS 函数2 输出dl 中的一个字符。在您的代码中,dl 中的值似乎是mov dx, di 之后的0255 之后的mov byte ptr dl, -1

这两个字符(0 和 255)都是不可见的。

我认为您可以通过将标准输出重定向到文件并查看该文件的十六进制转储来更好地了解正在发生的事情。

【讨论】:

  • 我可以使用什么调试器来查看操作结果而不输出?你能给我推荐一个 IDE 或调试器吗? Turbo Debugger 在我的电脑上不起作用
  • 我在 DOSBox 中使用 Turbo Debugger 和标准 DOS 调试器 debug.com
【解决方案2】:

您的代码没有意义。这里有很多问题。

  1. 您没有在循环中的任何位置修改di,因此您每次都在检查数组中的第一个元素。

  2. 每次循环都从 cx 中减去 2,因此最终只会循环遍历数组的一半。

  3. 您将dl 视为字节指针,并在搜索失败时写入它。

  4. 您将结果打印为字符,而不是数字。

  5. 您正在为 DOS 环境编写 16 位 x86 程序集。几十年来,这不是一个任何人都认真用于任何事情(除了引导加载程序)的平台。

    如果您想学习汇编,请为现代系统学习 32 位(或 64 位)汇编。 DOS 是一个非常不同的地方。

【讨论】:

  • 我可以使用什么程序将其组装成 32 位或 64 位? (现在我不能这样做,因为我使用 tasm)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-07-23
  • 2012-03-20
  • 1970-01-01
  • 1970-01-01
  • 2016-03-29
  • 2020-01-28
  • 1970-01-01
相关资源
最近更新 更多