2012-01-12 2 views
1

привет, я использую NASM в ubuntu 11.10 и написал программу, используя его, следующий код будет распечатывать ровно один символ за раз.Печать символов на экране с помощью сборки

[BITS 16]  ;Tells the assembler that its a 16 bit code 
    [ORG 0x7C00] ;Origin, tell the assembler that where the code will 

    ;segment .data 
     PROMPT1 db "HELLO WORLD",0x0 
     STAR db '*' 
    ;segment .text 
     ;global asm_main 
    ;asm_main: 
     mov  si, PROMPT1 
     mov  al, [si] 
     ;mov ecx, 11 
    loop_start: 
     call PRNTCHR 
     inc  si 
     mov al, 0xA 
     call PRNTCHR 
     mov  al, [si] 
     cmp  al, 0 
     je  $+4 
     loop loop_start 
     jmp   $ 

    PRNTCHR: 
     MOV AH, 0x0E  ;Tell BIOS that we need to print one charater on screen. 
     MOV BH, 0x00  ;Page no. 
     MOV BL,0x0F  ;Text attribute 0x07 is lightgrey font on black background 

     INT 0x10 ;Call video interrupt 
     RET   ;Return to calling procedure 

    TIMES 510 - ($ - $$) db 0 ;Fill the rest of sector with 0 
    DW 0xAA55     ;Add boot signature at the end of bootloader 

У меня есть два вопроса относительно этого сегмента кода.

  1. хотя star db '*' ничего не делает в коде, но это важно.
  2. Печать новой строки не работает эффективно. программные выходы, а также

Вы можете мне помочь?

+0

Вы действительно хотите выполнить данные ('db" HELLO WORLD ", 0x0') в качестве кода ??? –

+0

Я хочу распечатать терминал или qemu virtual hard, как это. h \ ne \ n ..... \ n указывает новую строку – Zeemaan

ответ

0

Несмотря на то, что в заданном идентификаторе он находится в двоичном файле, как он есть, после загрузки в исходное состояние процессор продолжает увеличивать IP-адрес и запускать код, в случае его печати, когда «*» есть чисто случайный (когда PROMPT1 преобразуется в инструкции!). Этого не произойдет, если есть сегментация, но в этом режиме сегментация не включена по умолчанию, при переносе сегментированного кода в несегментированный код вы должны поместить данные без кода, после того, как код, который вы хотите запустить, прост, Спасибо Alex (за то, что вы хотите до бегать)!