ХОРОШО ТАК вот 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
Вы не показать, как вы собираете, но одна вещь, которая меня поражает то, что вы не имеете директиву ORG в вершина. Как 'ORG 0x7c00'. Возможно, вы использовали '-f bin' при сборке с _NASM_ и использовали ORG по умолчанию 0x0000. Хотя это не будет вашей проблемой. Int 10h/ah = 0eh печатает по одному символу за раз и не принимает адрес памяти в _BX_ –
Да, это тестовая программа. Я на самом деле пытаюсь понять, как вызывать макросы, но не может заставить его правильно запускать этот код. Я использую -f bin при сборке с NASM –
Вы также должны поместить свои данные после 'jmp $'. Размещение его перед JMP приведет к тому, что процессор будет декодировать данные в «HELLO» в качестве инструкций и может привести к неожиданному поведению. –