我在ubuntu 11.10中使用NASM并使用它编写了一个程序,下面的代码会一次打印出一个字符。
[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
我对这段代码有两个问题。
答案 0 :(得分:0)
即使它是给定一个标识符,它仍然存在于二进制文件中,在加载到原点之后,处理器继续增加IP并运行代码,当'*'打印时它的情况纯属巧合(当PROMPT1转换为指令时!)。当存在分段时,这不会发生,但是在此模式下,默认情况下不启用分段,当将分段代码移植到非分段代码中时,您应该将非代码数据填充到您想要运行的代码之后,这很简单,谢谢亚历克斯(因为你想运行)!