2012-02-24 51 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