ORG 07C00H的意思 简单说来,该指令用来修正该指令以后出现的(变量/标志的)内存地址,也就是说如果有ORG 0x12345h,那么在该指令以后的变量的地址将被修正为0x12345+old_addr。 对于DOS中的COM文件,在被DOS装载进内存后,系统会在内存的CS:0000 – CS:0100区域创建一个PSP,这里存放了一些系统所需的信息,比如通过...
所以,一般编程不加org,因为程序默认加载地址的偏移就是0000h,可写引导扇区时,程序会被加载到0000段,偏移7c00,偏移不是0000,所以用org让所有的内存引用全都加上7c00h。于是,在引导扇区程序里,我们开头会看到这么一句 org 7c00h,因为汇编里十六进制要以数字开头,所以应该这么写org 07c00h。 至此,我想说的说完了,...
也就是说任何系统,他的引导程序都必须安排在07c00h开始的地方,否则就不能被正确的引导。当引导程序完成后我们就进入了Linux Windows等系统了。 后面为了调试方便,还可以吧org 07c00h改为0100h,生成 com文件就能直接在dos下运行。cx表示的是字符串的个数,10进制的,可以自行修改,boot sector的结束地址也是固定的,...
传址操作是一样的目的.对于作者的那段程序可以去掉第一行的org 07c00h.把"mov ax,BootMessage" 改成"mov ax,BootMessage+07c00h",效果是一样的. 但是如果有大量的传址操作,那就要在每个地方都要+07c00h,那是一件非常头痛的事. 所以在第一行加上org 07c00h只是让编译器从相对地址org 07c00h处开始编译...
可以推测,由于没有使用ORG 7C00H且重新设定了段DS和ES的值,因此二进制程序的最终地址是0002H。验证如下: (三) 通用设置 通过以上的分析,我们可以得出普遍的规律就是,要想不使用ORG,只需根据CS和程序放置偏移地址计算并重置DS,ES即可: DS'*10H=ES'*10H=CS*10H+ORG ...
理解ORG指令,是这样注释的:处但是我看到一些资料说,bios加载到07c00h如果没有org但编译器仍会进行这个运算)是从0000后面跟的数字。Ndisasm-o0x0000boot.bin>>disboot1.asm:
org 07c00h mov ax,cs mov ds,ax mov es,ax call screen jmp $ screen:mov ax,bootmsg mov bp,ax mov cx,16 mov ax,01301h mov bx,000ch mov dl,0 int 10h ret bootmsg:db'Hello OS world!'times 510-($-$$) db 0 dw 0xaa55 但是我看到⼀些资料说,bios会⾃动将引导程序加载到07c00...
3org07c00h 4;org0100h 5movax,cs 6movds,ax 7moves,ax 8 9movah,10h 10moval,03h 11movbl,01h 12int10h 13 14PrintStringBootMessage,LenOfBootMessage,display_mode_2,0h, (ATTR_BLACK<<4)|ATTR_GREEN,0000h 15 16hlt;停机 17 19BootMessage:db"DreamixStartingPleasewait..." ...
org 07c00h mov ax,cs mov ds,ax mov es,ax call screen jmp $ screen:mov ax,bootmsg mov bp,ax mov cx,16 mov ax,01301h mov bx,000ch mov dl,0 int 10h ret bootmsg:db'Hello OS world!' times 510-($-$$) db 0 dw 0xaa55 ...
再回头看于渊前辈的注释: org07c00h ;告诉编译器加载到7c00h处 这句注释是没有问题的。为什么?因为bios初始化完成之后,会将cs:ip设置为0000h:7c00h。看到没,cs是0,所以偏移地址就是物理地址了。 最后说一句:许多人都说masm的offset多余,丑陋,说nasm的标签直接取址,很简洁。我想各有千秋吧:至少对新手来说,of...