2015-08-23 84 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) –