2014-12-26 76 views
1

我想在屏幕上的寄存器中打印一個數字。此外,我想將它保存爲一串字符(字節)。所以,如果我有一個數字,如150,我想它在某個地址保存爲打印編號到屏幕組件

「1」,「5」,「0」

mov ebx, dword ptr[ebp+8] 
; eax contains value 
; ebx contains address to store characters 

; here is where conversion would take place 

因爲它是在寄存器中,你會必須將其轉換爲十進制值,然後分隔每個地方?

+0

在什麼樣的操作系統,並允許你自己什麼庫? – duskwuff

+0

x86 Windows。我意識到有多個庫可用,但是我作爲一個更大的裸機程序的一部分嘗試瞭解更多關於彙編編程的內容。 –

+0

你是否確實是指Windows(如圖形窗口)或16位MS-DOS子系統(如DOS提示符)?他們完全不同。 – duskwuff

回答

1

我不確定如何打印ASCII碼以及如何分隔每個地方。因此,我只想說明如何將EAX的值轉換爲十進制ASCII的值並將其存儲到DS:EBX的地址。對於最大爲0FFFFFFFFh的32位值,我們需要一個十位十進制ASCII的位置(4294967295)。例如,如果該值是十進制數150,那麼我們在開始時就會得到「0000000150」的ASCII碼,並帶有一些「0」。

 mov  cl, 0Ah    ; counter for ten decimal ASCII's 
     mov  edi, 1000000000 
P1: xor  edx, edx 
     div  edi 
     add  al, 30h    ; convert to ASCII 
     mov  esi, edx   ; save remainder 
     mov  [ebx], al   ; store ASCII to the address of DS:EBX 
     inc  ebx 
     mov  eax, edi 
     mov  edi, 0Ah 
     xor  edx, edx 
     div  edi 
     mov  edi, eax 
     mov  eax, esi 
     dec  cl 
     jnz P1 
+0

這似乎沒問題。但是,如果我不想要前導零,我相信你可以在分割後添加一些東西來檢查餘數是否等於原始數。 'cmp edx,esi' –