补码(8位有符号数范围 -128 ~ 127 , 16位有符号数范围 -32768 ~ 32767)
最高位为1,表示负数;
正数补码取反加1后,为其对应的负数补码;负数补码取反加1后,为其绝对值.
例:1的补码:00000001b,取反加1后为:11111111b,表示-1;
10000000b,取反加1后为:10000000b,大小为128,所以这个码就表示-128
显示缓冲区(80 * 25 每行80个字符一共25行 一共分为8页 B8000H ~ BFFFFH)
第一页:B800:0000 ~ B800:0F9F (0 ~ 3999)
000 ~ 09F 对应第0行(80个字符占位160个字符) (0 ~ 159)
0A0 ~ 13F 对应第1行(160 ~ 319)
140 ~ 1DF 对应第2行
F00 ~ F9F 对应第24行
一个字符占两个字节,低位存放ASCII码.高位存放属性
00 ~ 01 对应第0列
02 ~ 03 对应第1列
9E ~ 9F 对应第79列
属性字节的格式: 7 6 5 4 3 2 1 0
R:红色 BL R G B I R G B
G:绿色 闪烁 ~~~~~~背景 高亮 ~~~~~~前景
B:蓝色
offset 伪指令,功能是取得标号的偏移地址,如: start:mov ax,offset start 相当于mov ax,0
计算代码长度 mov ax,offset 1 - offset 0
0:需要确定长度的代码段
1:可以是代码段也可以写个空白nop
转移指令
只修改IP时,称为 段内转移,比如: jmp ax (用AX的值为IP赋值)
同时修改CS和IP时,称为 段间转移,比如:jmp 1000:0
根据范围又可分为:短转移IP修改范围(-128 ~ 127) 近转移IP修改范围(-32768 ~ 32767)
jmp short 标号 (转到标号处执行指令) short 指明是段内短转移(功能表示为:(IP)=(IP)+8位位移)
8位位移="标号"处地址 - JMP指令后第一个字节的地址
short指明此处的为8位位移(位移范围-128 ~ 127,用补码表示)
jmp near ptr 标号 (段内近转移)(功能表示为:(IP)=(IP)+16位位移)
jmp far ptr 标号 (段间转移 也叫 远转移)
(功能表现为:(CS)=标号所在段的段地址;(IP)=标号所在段中的偏移地址)
例:0BBD:0006 EA0B01BD0B JMP 0BBD:010B
jmp word ptr 内存单元地址(段内转移)
jmp dword ptr 内存单元地址(段间转移)( (CS)=(内存单元地址+2) (IP)=(内存单元地址) )
有条件转移指令(所有的有条件转移指令都是短转移"-128 ~ 127")
jcxz 标号 (如果(cx)=0,转移到标号处执行,否则程序向下执行)
相当于 if((cx)==0)jmp short 标号;
循环指令(所有的循环指令都是短转移)
loop 标号 ((cx)=(cx)-1,如果(cx)不等于0,转移到标号处执行)
操作流程:1. (cx)=(cx)-1
2. 如果(cx)不等于0,(IP)=(IP)+8位位移
ret 指令用栈中的数据修改IP的内容,实现近转移(-32768 ~ 32767),相当于 pop ip
retf 指令用栈中的数据修改CS和IP的内容,实现远转移(段间转移), 相当于 pop ip pop cs
ret n 指令格式,相当于 pop I