2016-10-20 2 views
0

Я пытаюсь напечатать строку в Q эмуляторе, используя NASM. Мой код, как показано ниже:Как печатать строки в языке ассемблера

mov bx,HELLO 
mov ah, 0x0e 
int 0x10 
HELLO: 
    db 'Hello', 0 
jmp $ 
times 510-($-$$) db 0 
dw 0xaa55 

Однако при компиляции этого кода, вывод, который я получаю

UU 

Может кто-нибудь, пожалуйста, тел мне, почему это так? И как получить требуемую строку в качестве вывода?

Заранее спасибо.

+1

Вы не показать, как вы собираете, но одна вещь, которая меня поражает то, что вы не имеете директиву ORG в вершина. Как 'ORG 0x7c00'. Возможно, вы использовали '-f bin' при сборке с _NASM_ и использовали ORG по умолчанию 0x0000. Хотя это не будет вашей проблемой. Int 10h/ah = 0eh печатает по одному символу за раз и не принимает адрес памяти в _BX_ –

+0

Да, это тестовая программа. Я на самом деле пытаюсь понять, как вызывать макросы, но не может заставить его правильно запускать этот код. Я использую -f bin при сборке с NASM –

+0

Вы также должны поместить свои данные после 'jmp $'. Размещение его перед JMP приведет к тому, что процессор будет декодировать данные в «HELLO» в качестве инструкций и может привести к неожиданному поведению. –

ответ

0

ХОРОШО ТАК вот thingamabob на ваш вопрос

Для того, чтобы загрузить строку, вы должны переместить его в си (на самом деле не хотят идти в глубокий, но только делать это). Затем, чтобы загрузить символ в регистр AL, используйте lodsb. Затем мы должны напечатать его так, чтобы использовать int 10h mov ah, 0Eh. Int 10h обрабатывает видео, а ah сообщает BIOS распечатать все, что у нас есть (alka lodsb). Затем у нас должен быть конечный загружающий символ, поэтому мы просто не зацикливаемся навсегда. Я лично использую 0x00 однако вы используете 0. 0x00 намного лучше в моем случае, потому что не только вы можете использовать 0, 0x00 ничего не печатает, так зачем вам когда-нибудь понадобится?

ХОРОШО так что мы получили все, что сделано, и происходит вот код:

 
    mov si, message  ;The message location *you can change this* 
    call print   ;CALL tells the pc to jump back here when done 

    print: 
     mov ah, 0Eh   ;Set function 

    .run: 
     lodsb    ;Get the char 
    ; cmp al, 0x00  ;I would use this but ya know u dont so use: 
     cmp al, 0   ;0 has a HEX code of 0x48 so its not 0x00 
     je .done   ;Jump to done if ending code is found 
     int 10h    ;Else print 
     jmp .run   ; and jump back to .run 

    .done: 
     ret     ;Return 

    message   db 'Hello, world', 0 ;IF you use 0x00 
    ;message   db 'Hello, world', 0x00 

Смежные вопросы