2012-02-24 53 views
0

我正在尝试打印出偏移值。 (是一届“打印”是否正确?是否有另一种说法呢?程序集:如何打印偏移值

代码是否正确?我比较困惑与装配文档。

print_offsets: mov SI,0 
       mov CX,30 
       mov AH,2 
       int 21h 
       jmp offsloop 

offsloop:  cmp 0,Array[SI] 
       ja print_offset ;if the array element is nonzero 
       inc SI 
       dec CX 
       jnz offsloop 

print_offset: mov DL,SI 
       mov AH,2 
       int 21h 

回答

0

如果你想打印的数字,你的代码不正确。

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转换程序。但是有很多代码示例可以做到这一点。

+0

为什么您需要保存当前计数? – 2012-02-24 17:01:29

+0

执行将在print_offset后继续到下一个数组元素。如果INT 21修改cx寄存器,则计数值(您仍在使用)将会出错。 – adelphus 2012-02-24 17:43:09

+0

我明白了。那么cx和si在哪里被推入?他们自己的cx []和si []数组? – 2012-02-28 17:57:17