2015-08-23 47 views
0

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

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 

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

+0

你是如何组装和运行它? – icktoofay

+0

在dosBox中有tasm –

+0

除了这里的其他评论,你应该有| mov ax,4c00h | int 21h |就在|之前结束|正确退出程序。 – rcgldr

回答

0

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

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

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

+0

什么调试器可以用来查看操作的结果而不输出?你能推荐我一个IDE或调试器吗? Turbo Debugger无法在我的电脑上运行 –

+0

我使用Turbo Debugger和标准的DOS调试器'debug.com',两者都在DOSBox – anatolyg

0

你的代码没有意义。这里有很多错误。

  1. 你是不是修改di回路中任意,所以你检查阵列中的每个时间的第一要素。

  2. 您每次通过循环都会从cx中减去2,所以您最终只能循环访问数组的一半。

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

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

  5. 您正在为DOS环境编写16位x86程序集。几十年来,这不是任何人都认真使用过的任何平台(除bootloaders之外)。

    如果你想学习装配,学习一个现代系统的32位(或64位)装配。 DOS是一个非常不同的地方。

+0

中我可以使用什么程序将其组装到32位或64位? (现在我不能这样做,因为我使用tasm) –