注意
大于9FFFH的十六进制数据,在书写的时候都是以字母开头的。而在汇编源程序中,数据不能以字母开头,所以要在前面加0。
debug中 ds = 0B2DH 时,程序在0B3D:0处,段地址要+10H 10H为PSP所占的空间。
16位寄存器,不能直接add 8位内存单元中的值
在操作系统允许的情况下,程序可以获取任意容量的空间。
cx 存放循环次数 loop 连用 和 jcxz
bx 和 [] 内存空间连用
ax 和 dx会用来存放div指令的被除数、商和余数。
1字节 = 8位
16位系统 : 1字 = 2字节 = 16位 1个字为2个内存单元,1字节是一个内存单元
32位系统 : 1字 = 4字节 = 32位
64位系统 : 1字 = 8字节 = 64位
dw 定义字类型
db 定义字节类型
16位10进制最大为65536
jmp中段间转移 高地址都是段地址,低地址都是偏移地址。
汇编编译器并不认识 jmp 2000:1000 这种转移指令,在源程序中使用会报错。只能在Debug中使用的汇编指令。
cs:ip指向的内存单元的内容为机器码。
通过补码化为转换成16进制(补码方式存储)00001010(源码10)» 11110101(取反)»11110110(加一)=F6H 。
指令的机器码读入的时候,此时指令还没执行,但是IP的值已经指向下一条指令的地址了。
指令系统总结
1.数据传送指令
比如,mov、push、pop、pushf、popf、xchg等都是数据传送指令,这些指令实现寄存器和内存、寄存器和寄存器之间的单个数据传送。
2.算术运算指令
比如:add、sub、adc、sbb、inc、dec、cmp、imul、idiv、aaa等是算术运算指令,这些指令实现寄存器和内存中的数据的算术运算。它们的执行结果影响标志寄存器的sf、zf、of、cf、pf、af位。
3.逻辑指令
比如:and、or、not、xor、test、shl、sal、sar、sol、rol、ror、rcl、rcr等都是逻辑指令。除了not指令外,它们的执行结果都影响标志寄存器的相关标志位。
4.转移指令
可以修改IP,或同时修改CS和IP的指令统称为转移指令。
1)无条件转移指令:jmp
2)条件转移指令:jvxz、je、jb、ja、jnb、jna等
3)循环指令:joop
4)过程:call、ret、retf
5.处理机控制指令
这些指令对标志寄存器或其他处理机状态进行设置,比如:cld、std、cli、sti、nop、clc、cmc、stc、hlt、wait、esc、lock等都是处理机控制指令。
6.串处理指令
这些指令对内存中的批量数据进行处理,比如:movsb、movsw、cmps、scas、lods、stos等。若要使用这些指令方便的进行批量数据的处理,则需要和rep、repe、erpne等前缀指令配合使用。