如果你想打印的数字,你的代码不正确。
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