2011-10-23 62 views
3

我需要提示用戶一個msg,告訴他寫一個數字,然後我存儲這個數字,並對它做一些操作 在INT 21h搜索後,我發現這樣的:使用INT 21h(DOS)&8086讀取一個數字assmebly

INT 21h/AH=1 - read character from standard input, with echo, result is stored in AL. 
if there is no character in the keyboard buffer, the function waits until any key is pressed. 

example: 

    mov ah, 1 
    int 21h 

的主要問題,這隻能讀取一個字符,它表示爲ASCII 所以如果我需要寫數字「357」 我將它讀成3,5,7

這不是我的目標。 有什麼想法?

+0

如果你需要閱讀三個字符,您必須將讀取一個字符的呼叫置於循環中,直到您有三個您想要的字符。 –

+0

@Pet eWilson我需要閱讀整個數字作爲一個「整體」 所以我可以做例如添加它... etc – xsari3x

回答

4

When you managed to get the user input,把其指針在ESI(ESI =地址字符串)

.DATA 
myNumber BYTE "12345",0  ;for test purpose I declare a string '12345' 

Main Proc 
    xor ebx,ebx    ;EBX = 0 
    mov esi,offset myNumber ;ESI points to '12345' 

loopme: 

    lodsb      ;load the first byte pointed by ESI in al 

    cmp al,'0'     ;check if it's an ascii number [0-9] 
    jb noascii     ;not ascii, exit 
    cmp al,'9'     ;check the if it's an ascii number [0-9] 
    ja noascii     ;not ascii, exit 

    sub al,30h     ;ascii '0' = 30h, ascii '1' = 31h ...etc. 
    cbw      ;byte to word 
    cwd      ;word to dword 
    push eax 
    mov eax,ebx    ;EBX will contain '12345' in hexadecimal 
    mov ecx,10 
    mul ecx     ;AX=AX*10 
    mov ebx,eax 
    pop eax 
    add ebx,eax 
    jmp loopme     ;continue until ESI points to a non-ascii [0-9] character 
    noascii: 
    ret      ;EBX = 0x00003039 = 12345 
Main EndP 
+2

我爲你戴上帽子,謝謝 – xsari3x

2

一旦你得到了字符串,你必須將其轉換爲數字。問題是,你必須編寫你自己的程序來做到這一點。這是我通常使用的一個(用C編寫):

int strToNum(char *s) { 
    int len = strlen(s), res = 0, mul = 0; 
    char *ptr = s + len; 

    while(ptr >= s) 
     res += (*ptr-- - '0') * (int)pow(10.0, mul++); 

    return res; 
} 

下面是解釋。首先,*ptr-- - '0'得到一個數字的整數表示(所以'9' - '0' = 9,然後它遞減ptr,使它指向前一個字符。一旦我們知道了這個數字,我們必須將它提高到10的冪。例如,假設輸入的是「357」,什麼代碼所做的是:

('7' - '0' = 7) * 10^0 = 7 + 
('5' - '0' = 5) * 10^1 = 50 + 
('3' - '0' = 3) * 10^2 = 300 = 
--------------------------------- 
          357 
+0

如何在彙編:)做到這一點? – xsari3x

+0

@ xsari3x:只需將代碼翻譯爲程序集;)最難的部分是你必須自己編寫的pow()函數。如果你想要十六進制數字,你可以通過簡單的左移來完成。 – BlackBear