2011-12-29 69 views
2

我有這段彙編代碼來接受一個字符串並顯示字符串返回。彙編代碼顯示字符串

我的問題是我無法弄清楚如何在name1中存儲名稱,因爲我們使用buff來存儲來自用戶的輸入。

我知道

buff label byte 
maxchar db 50 
readchar db 0 
name1 db 48 dup(0) 

是得到的東西與此有關。但我無法理解工作。

.model small 
.stack 
.data 
    buff label byte 
    maxchar db 50 
    readchar db 0 
    name1 db 48 dup(0) 
    m1 db 10,13,"enter name: $" 
    m2 db 10,13,"your name is: $" 
.code 
    mov ax, @data 
    mov ds, ax 
    lea dx, m1 
    mov ah, 09 
    int 21h 
    lea dx, buff 
    mov ah, 10 
    int 21h 


    mov ah,0 
    mov al, readchar 
    add ax, 2 
    mov si, al 
    mov buff[si],24H ;ascii code for $ to terminate string 
    lea dx, m2 
    mov ah, 9 
    int 21h 
    lea dx, name1 
    mov ah, 09 
    int 21h 

    mov ah, 4ch 
    int 21h 
end 

請大家幫忙!

謝謝。

回答

3

使用執行緩衝輸入的DOS函數0x0a(或代碼中的十進制數)讀取輸入。的DS:DX參數指向具有以下格式的緩衝器,其在buff(或等價maxchar)在程序中標記的位置:

offset meaning 
------ ------------- 
    0  Number of bytes available for the input data (starting at offset 2) 
    1  A location for DOS to put the number of characters read into the buffer 
    2  A buffer of bytes that can hold the number of characters specified in 
      offset 0 

所以在代碼,DS:DX指向buff它表示最多可以將50個字符放入緩衝區name1。它看起來像代碼有潛在的問題,因爲緩衝區中只有48個字節,但數據結構表明有50個字節。所以輸入可能會覆蓋m1的前兩個字節。現在,彙編程序 - 特別是舊程序 - 被稱爲執行各種技巧以節省空間。在調用DOS函數0x0a之後不會使用m1,所以這可能是有意的(但如果是這樣,我不確定爲什麼更多的m1不可用)。我猜想這是無意的,而且這個錯誤從來沒有表現出任何明顯的表現。

+0

此外,它可能應該是'mov si,ax',而不是'mov si,al'。只有'movsx'和'movzx'可以將一個8位寄存器值移動到一個16位寄存器,'mov'不能。 – 2011-12-29 08:03:00

+0

非常感謝:)清除了我的疑問! – 2011-12-29 08:13:13