2013-05-21 210 views
0

我有這樣的代碼:打印輸出

INCLUDE Irvine32.inc 

.data 
    arry BYTE ? 
    prompt1 BYTE "Enter first hex number: ",0 
    prompt2 BYTE "Enter second hex number: ",0 
    prompt3 BYTE "The sum is ",0 
    prompt4 BYTE "The sum is out of range ",0 
    prompt5 BYTE "Convert again? [y/n]: ",0 
    prompt6 BYTE "First number is invalid ",0 
    prompt7 BYTE "Second number is invalid ",0 

.code 
main PROC 
    ReadInput: 
     L1: 
      mov edx, OFFSET prompt1 
      call writeString 
      mov edx, 0 
      call readHex 
      call Crlf 
      mov ecx, eax 
      jmp L3 
     L2: 
      mov eax, 0 
      mov edx, OFFSET prompt2 
      call writeString 
      mov edx, 0 
      call readHex 
      call Crlf 
      mov ebx, eax 
      mov eax, 0 
      jmp L4 
     L3: 
       cmp ecx, 0FFFFh 
       JA L5 
       JBE L2 
     L4: 
       cmp ebx, 0FFFFh 
       JA L6 
       JBE addInt 
     L5: 
       mov edx, OFFSET prompt6 
       call writeString 
          mov edx, 0 
       call Crlf 
       jmp L1 
     L6: 
       mov edx, OFFSET prompt7 
       call writeString 
       mov edx, 0 
       call Crlf 
       jmp L2 

    addInt: 
     clc 
     mov ax, cx 
     add ax, bx 
     JC printError 
     jmp convert 

; convert hex to string 
    convert: 
      mov ecx, 0 
      mov esi, 0 
      mov si, 4 
      mov cx, 10h 

    convertDigit: 
      dec si 
      mov dx , 0 
      div cx 
      cmp dx, 9h 
      JA convertLetter 
      add dx, 30h 
      jmp printSucess 

    convertLetter:  
      add dx, 37h 
      jmp printSucess 

    printError: 
      mov edx, OFFSET prompt4 
      call writeString 
      call Crlf 

    printSucess: 
      mov arry[si], dl 
      cmp ax , 0 
      JNE convertDigit 
      mov edx, OFFSET arry 
      add dx, si 
      call writeString 
      call Crlf 


    exit 
main ENDP 
END main 

,當我試圖打印輸出我得到這個

輸入第一個十六進制數:FF

進入第二個十六進制數:FF

1FEer第一個十六進制數: 按任意鍵繼續。 。 。

你可以看到,有PROMPT1的一部分,er first hex number它套牢的總和1FE的價值,爲什麼會出現這種情況

程序循環EDX寄存器3次第一時間的價值是E時,第二次是F,第三次是1,那麼它得到writeString打印輸出,這似乎是程序假設要做的事情,此時edx值突然跳到00405911,爲什麼會發生這種情況?

在此先感謝幫助

+0

EDX的地址時,複製PROMPT1 toedx是他一樣複製總和EDX當EDX的地址,導致合計追加和替換零件的提示1,我如何使edx更改爲不同的地址,所以它只會輸出總和,而不會將prompt1的部分添加到它? – bluebk

+0

代碼丟失。 – Devolus

+0

不,我沒有複製和粘貼所有東西 – bluebk

回答

0

將NULL結束符添加到轉換後的字符串中。你可以做的convertDigit循環之前右:

mov byte ptr [arry+4],0 


順便說一句,當你被兩個(如16)的功率除以你不需要div。您可以使用更快的按位與和移位指令:

mov dx,ax 
and dx,15 ; dx = ax & 15 (== ax % 16) 

shr ax,4 ; ax = ax >> 4 (== ax/16) 
+0

啊,謝謝,我不允許在這個任務上使用按位操作 – bluebk

+0

請問'mov byte ptr [arry + 4],0'是做什麼的?它是否只讀取索引4的地址? – bluebk

+0

在你的循環中,你首先將si設置爲4,然後在存儲任何字符之前預先遞減(所以你寫入的最高地址是arry + 3)。因此,新指令的作用是在最後一位數字之後放置一個NULL結束符,以便'writeString'知道十六進制字符串的結束位置。 – Michael