如果你想打印的數字,你的代碼不正確。
INT 21h, AH=2
輸出ASCII character。你的代碼做的是把偏移值成DL。DOS將把該偏移值作爲一個ASCII字符和輸出來代替。
例如,假設第一個非零元素的偏移量爲7.您的代碼將使用DL=07
調用INT 21h, AH=2
。 DOS將輸出ASCII字符07h,這是BEL(基本上是系統嗶聲)。相反,您可能需要DL=37h
以輸出代表數字7位的ASCII字符37h。
有幾種解決方法。
第一種方式很簡單 - 如果你的陣列從來沒有超過10元,你可以簡單地添加30H的偏移,偏移值,以正確的ASCII字符值轉換:
print_offsets: mov SI,0 ; SI=offset
mov CX,10 ; CX = count (must be <= 10!!!!)
offsloop: cmp 0,Array[SI]
ja print_offset ;if the array element is nonzero
next_element: inc SI
dec CX
jnz offsloop
jmp finished
print_offset: mov DL,SI
add DL, 30h ; convert offset to ASCII digit 0..9
mov AH,2
; save the registers in case INT 21h modifies them!
push cx ; save current count
push si ; save current offset
int 21h
pop si ; restore current offset
pop cx ; restore current count
jmp next_element
finished:
; do something else!
第二種方式比較複雜,因爲你需要實現一個完整的整數到ASCII轉換程序。但是有很多代碼示例可以做到這一點。
爲什麼您需要保存當前計數? – 2012-02-24 17:01:29
執行將在print_offset後繼續到下一個數組元素。如果INT 21修改cx寄存器,則計數值(您仍在使用)將會出錯。 – adelphus 2012-02-24 17:43:09
我明白了。那麼cx和si在哪裏被推入?他們自己的cx []和si []數組? – 2012-02-28 17:57:17