2017-11-11 157 views
1

我正在使用dosBox和nasm來運行此程序。我正在編寫一個彙編程序,它接收用戶輸入的字符串,然後從該字符串中提取每個字符並將其放入一個寄存器。我認爲做mov字節阿爾,msg2會做的伎倆。不過,我收到一個錯誤,OBJ輸出驅動程序不支持一個字節的搬遷。」我如何採取一個字符一個字符串的時間,並將其存儲到寄存器?將字符從字符串移到程序集中的寄存器

%include "io.mac" 
.STACK 100H 
.DATA 
    msg1 db "Please enter your name",0 
    msg2 TIMES 10 Db 0 

    .CODE 
     .STARTUP 

    PutStr msg1 ; print msg1 on the output 
    nwln 
    GetStr msg2 ; input string into first space in table 
    nwln 
    PutStr msg2 ; output string in register table 
    mov byte al, msg2 


    PutStr ax 
    done:       
     .EXIT 
+0

你試過'MOV人,msg2'呢? –

+0

你爲什麼「想」會起作用?在彙編中,有20-30%的東西違背常識(除非你自然像機器一樣思考)。而是使用文檔,一些書籍和/或教程。 – Ped7g

回答

1

指令mov al, msg2將有你得到的字符串如果這是MASM的第一個字節,但由於您使用的NASM你需要,只要你想,以解決內存寫入的方括號。

mov al, [msg2] 

當你寫mov byte al, msg2,你問NASM把地址msg2中的AL寄存器幾乎總是錯誤的,因爲偏移地址應該是16位!這就是爲什麼你收到的錯誤:

obj output driver does not support one-byte relocations


因爲你的目標似乎是得到,一前一後,該字符串的每個字符,剛剛獲得第一個字符不禁指令你非常。您需要將字符串的地址放入寄存器,讀取寄存器指向的內存,然後遞增寄存器。在對AL執行了一些有用的操作之後,您將測試寄存器是否指向字符串的最後一個字符後面,如果沒有,則跳轉回讀取下一個字符。

mov  bx, msg2 
Next: 
    mov  al, [bx] 
    inc  bx 
    ... 
    cmp  bx, msg2 + 10 ;Only if msg2 has precisely 10 characters 
    jb  Next 

如果任何代碼更換了像這樣的循環只能工作...用,不揍循環控制寄存器BX。如果需要的話加入pushpop說明,您可以保留自己BX

mov  bx, msg2 
Next: 
    mov  al, [bx] 
    inc  bx 
    push bx 
    ... 
    pop  bx 
    cmp  bx, msg2 + 10 ;Only if msg2 has precisely 10 characters 
    jb  Next 
相關問題