PSP:DOS要利用PSP段前缀和被加载的程序进行通信。
bx偏移地址mov ax,[bx]mov al,[bx]loop循环指令(cx)=(cx)-1判断(cx),不为零则转至标号处执行,如果是零则向下执行段前缀用于显式的指明内存单元的段地址。
mov ax,ds:[bx]mov ax,cs:[bx]mov ax,ss:[bx]mov ax,es:[bx]debug和masm对指令的不同处理debug将 mov ax,[0] 中的 [0] 解释成内存单元,而masm汇编源程序将其解释成 0解决方案:使用bx或者显示给出段寄存器一段安全的空间在8086模式中,随意向一段内存空间写入内容是很危险的,因为这段空间可能存放着重要的系统数据或代码。
assume cs:codecode segmentstart:mov ax,0 mov ds,ax mov ds:[26h],ax mov ax,4c00h int 21hcode endsend start
练习
计算 ffff:0006 单元中的数乘以123,结果存储在dx中。
汇编源程序中,数字不能以字母开头跳出循环g IP数据放在什么位置?之前的程序中只有一个代码段,那么数据应该存放在什么位置?为了保证数据安全,0:200 ~ 0:2FF是相对安全的,但是这段空间容量只有256个字节,如果超出这个限制,数据应当如何存放?数据段
assume cs:codecode segment mov ax,0ffffH mov ds,ax mov bx,6 mov al,[bx] mov ah,0 mov dx,0 mov cx,123 s:add dx,ax loop s mov ax,4c00H int 21Hcode endsend
call指令
assume cs:codecode segment ; define word dw 0123H, 0456H, 0789H, 0abcH, 0defH, 0fedH, 0cbaH, 0987Hstart:mov bx,0 mov ax,0 mov cx,8 s:add ax,cs:[bx] add bx,2 loop s mov ax,4c00H int 21Hcode endsend start
当CPU执行 call 标号时,相当于进行:
push IPjmp near ptr 标号当CPU执行 call far ptr 标号时,相当于进行:
push CSpush IPjmp far ptr 标号ret和retf指令ret:pop IPretf: pop IP pop CS堆栈平衡EBP栈底指针ESP栈顶指针进入call前与执行call后EBP和ESP的值不变push ebp:相当于 sub,esp,4 和 mov [esp],ebppop ebp:相当于 mov ebp,[esp] 和 add esp, 4补充指令XCHG
交换指令只可以在寄存器之间、寄存器与存储器之间进行两个操作数长度必须相等例如:XCHG AX,BXNOT
取反指令,