- 注释由';'开始。
- 将显存映射到地址空间里,0xB8000~0xBFFFF。
- Intel的处理器不允许将一个立即数传送到段寄存器,只允许这样的指令:
mov 段寄存器,通用寄存器 mov 段寄存器,内存单元
- 为了方便,多数汇编语言编译器允许在指令中直接使用字符的字面值来代替数值形式的ASCII码,如:
mov byte [es:0x00], 'L' mov byte [es:0x00], 0x4c
- 为了访问内存单元,需要给出段地址和偏移地址。在mov byte [0x00], 'L'中,物理地址=DS左移4位+0x00。关键字byte用来修饰目的操作数。如mov [0x00], al和mov al, [0x02]则不需要。
- mov指令的目的操作数不允许为立即数,而且,目的操作数和源操作数不允许同时为内存单元。因此,如mov 0x1c, al和mov [0x01], [0x02]都是错误的。
- 汇编地址是指源程序编译期间,编译器为每条指令确定的汇编地址,指示该指令相对于程序或者段起始处的距离,以字节计。当编译后的程序装入物理内存后,它又是该指令在内存段内的偏移地址。
- 在NASM中,每条指令的前面都可以有一个标号,以指示和代表该指令的汇编地址。如:
infi: jmp near infi
或者不需要冒号,又或者单独占用一行位置:
infi:jmp near infi
因为infi所在的那一行没有指令,它的地址就是下一行的地址。
- DB(Declare Byte)、DW(Declare Word)、DD(Declare Double Word)、DQ(Declare Quad Word),均不能超过表达的大小
- 16位的二进制除以8位的二进制数:被除数在AX中,除数由8位通用寄存器或者内存单元提供。指令执行后,商在寄存器AL中,余数在寄存器AH中。比如:
div cl div byte [0x0023]
任何时候,只要是在指令中涉及内存地址的,都允许使用段超越前缀。如:
div byte [cs:0x0023] div byte [es:0x0023]
- 32位的二进制数除以16位的二进制数:被除数高16位在DX,低16位在AX,除数由16位的通用寄存器或者内存单元提供。指令执行后,商在AX中,余数在DX中。
- 异或操作xor:xor指令的两个操作数具有相同的数据宽度。对于清零操作,xor比 mov更高效。
- 相对近转移:
infi: jmp near infi
关键字near表示目标位置在当前代码段内,更重要的是,指示相对量是16位的。实际上,这是3字节指令,操作码是0xE9,后跟两字节的操作数。但是,该操作数并非目的位置的偏移地址,而是目标位置相对于当前指令的偏移量(以字节为单位)。在编译阶段,编译器用目标位置的汇编地址减去当前指令的汇编地址,再减去当前指令的长度(3B),得到了jump near infi的实际操作数。
- 主引导扇区最后两个字节数据为0x55和0xAA。
dw 0xaa55 ;或者 db 0x55, 0xaa
- 伪指令times可用于重复它后面的指令若干次。如
times 20 mov ax, bx
- 书上源代码:
;代码清单5-1 ;文件名:c05_mbr.asm;文件说明:硬盘主引导扇区代码;创建日期:2011-3-31 21:15 mov ax,0xb800 ;指向文本模式的显示缓冲区mov es,ax;以下显示字符串"Label offset:"mov byte [es:0x00],'L'mov byte [es:0x01],0x07mov byte [es:0x02],'a'mov byte [es:0x03],0x07mov byte [es:0x04],'b'mov byte [es:0x05],0x07mov byte [es:0x06],'e'mov byte [es:0x07],0x07mov byte [es:0x08],'l'mov byte [es:0x09],0x07mov byte [es:0x0a],' 'mov byte [es:0x0b],0x07mov byte [es:0x0c],"o"mov byte [es:0x0d],0x07mov byte [es:0x0e],'f'mov byte [es:0x0f],0x07mov byte [es:0x10],'f'mov byte [es:0x11],0x07mov byte [es:0x12],'s'mov byte [es:0x13],0x07mov byte [es:0x14],'e'mov byte [es:0x15],0x07mov byte [es:0x16],'t'mov byte [es:0x17],0x07mov byte [es:0x18],':'mov byte [es:0x19],0x07mov ax,number ;取得标号number的偏移地址mov bx,10;设置数据段的基地址mov cx,csmov ds,cx;求个位上的数字mov dx,0div bxmov [0x7c00+number+0x00],dl ;保存个位上的数字;求十位上的数字xor dx,dxdiv bxmov [0x7c00+number+0x01],dl ;保存十位上的数字;求百位上的数字xor dx,dxdiv bxmov [0x7c00+number+0x02],dl ;保存百位上的数字;求千位上的数字xor dx,dxdiv bxmov [0x7c00+number+0x03],dl ;保存千位上的数字;求万位上的数字 xor dx,dxdiv bxmov [0x7c00+number+0x04],dl ;保存万位上的数字;以下用十进制显示标号的偏移地址mov al,[0x7c00+number+0x04]add al,0x30mov [es:0x1a],almov byte [es:0x1b],0x04mov al,[0x7c00+number+0x03]add al,0x30mov [es:0x1c],almov byte [es:0x1d],0x04mov al,[0x7c00+number+0x02]add al,0x30mov [es:0x1e],almov byte [es:0x1f],0x04mov al,[0x7c00+number+0x01]add al,0x30mov [es:0x20],almov byte [es:0x21],0x04mov al,[0x7c00+number+0x00]add al,0x30mov [es:0x22],almov byte [es:0x23],0x04mov byte [es:0x24],'D'mov byte [es:0x25],0x07infi: jmp near infi ;无限循环 number db 0,0,0,0,0times 203 db 0db 0x55,0xaa
转载于:https://www.cnblogs.com/hlk09/p/9780596.html