2017-05-31 32 views
1

我想打印字符串'Hello World'的長度,即時獲取值(0Bh是11,但中斷正在打印ascii字符是♂而不是11 )emu8086 - 如何從ASCII碼獲得CHAR

org 100h 

LEA SI, msg 
MOV CL, 0 

CALL printo 


printo PROC 
next_char: 

    CMP b.[SI],0 
    JE stop 

    MOV AL,[SI] 

    MOV AH, 0Eh 
    INT 10h 

    INC SI 
    INC CL 

    JMP next_char 

printo ENDP 

stop: 

MOV AL,CL ; CL is 0B (11 characters from 'Hello World') 
MOV AH, 0Eh 
INT 10h ; but it's printing a symbol which has a ascii code of 0B 

ret 

msg db 'Hello World',0 
END 
+0

所以你的問題是如何將整數'11'轉換爲字符串'「11」'? –

+0

@Someprogrammerdude事情是,我沒有得到INTEGER 11,但ASCII 0Bh。它打印出ASCII表中第11個符號「♂」符號 – concretejungle

+0

字符串「Hello world」的長度爲* 11個字符(字節)。十進制中的'11'是十六進制的'0b',它是一樣的。你需要做的是將整數值「11」轉換爲*字符串*(即字符「1」兩次),然後打印字符串。或者如果你堅持不懈,它必須以十六進制打印(爲什麼?),然後將數字「11」轉換爲字符串「0b」,然後打印該字符串。重要的部分是轉換爲字符串,現在您必須決定是否希望字符串包含十進制或十六進制數字。無論哪種方式,如果你只是搜索一下,兩者都有很多例子。 –

回答

3
MOV AL,CL ; CL is 0B (11 characters from 'Hello World') 

隨着長度在AL可以很容易地表示它在十進制格式。
AAM指令將首先將AL寄存器除以10,然後將商數保留在AH中,其餘部分保留在AL中。
請大家注意,這個解決方案適用於從0所有長度爲99

aam 
add ax, "00" ;Turn into text characters 
push ax 
mov al, ah 
mov ah, 0Eh ;Display tenths 
int 10h 
pop ax 
mov ah, 0Eh ;Display units 
int 10h 

在事件所涉及的數小於10時,這將是醜陋實際上在前面的顯示爲零單個數字號碼。然後只需添加代碼旁邊:

aam 
add ax, "00" ;Turn into text characters 
cmp ah, "0" 
je Skip 
push ax 
mov al, ah 
mov ah, 0Eh ;Display tenths 
int 10h 
pop ax 
Skip: 
mov ah, 0Eh ;Display units 
int 10h 
+1

不錯的使用BCD指令('aa *'),我從來沒有真正困擾過學習:) –