通过点的形式 把立即数写到外面 对比c语言
结构体名字 数组名称 都相当于 基址bx;然后,用idata来定位结构体中的某一个数据项, 然后yao.team[1],里面的【1】也就相当于si
div除法指令
被除数:默认放在ax 或者dx ax
内存中实施除法
dup 设置重复的数据 db 3 dup(0)
db dw dd
流程转移-导学
转移指令 如jmp—可以修改ip或者同时修改cs和ip
分类 段内转移
段间转移
无条件转移jmp 条件转移jcxz 循环指令loop 过程 中断
offset 去的标号的偏移地址 offset 标号
在程序运行时,把某个指令复制到另一个地址—非常厉害的能力!
添加两条指令,让改程序在运行中将s处的一条指令复制到s0处
s: mov ax,bx mov si,offset s mov di,offset s0 mov cx,cs:[si] mov cs:[di],cx s0: nop nop
无条件转移jmp
根据位移进行转移—jmp short s–跳转相对位置—可正可负 也不用自己算 用补码表示 八位位移由编译程序在编译时算出jmp short s
立即数在机器指令中是有所体现的
近转移 jmp near ptr 标号
远转移far ptr s
转移地址在内存中的jmp word ptr ;jmp dword ptr
jmp 小结
注意:不能直接jmp2000:0100这样的 debug行 别的不行
jcxz :j跳转 cx zero 当cx等于0 跳转–转移的是位移
loop指令: 位移:要跳转的指令地址减去loop指令自己的下一条指令的首地址即:例如06-0a=-4----编译成为补码=FC
段内转移 都是一些相对转移 相对位移 有不少好处方便了浮动装配
模块化程序设计-主程序调用 子程序call,返回ret-返回到调用call的下一条语句继续执行下去–实质 修改ip
call 标号 ----调用子程序-cpu进行了两步操作:1将当前的ip或者ip和cs压入栈中(call指令的下一条地址);2转移到标号处执行指令
call push ip ip=ip+16位位移
段间转移 call far ptr 标号;
1 cs ip 都压栈
再跳转
转移到寄存器内的地址call ax
call word ptr 内存单元地址
返回指令ret–相当于pop ip用栈中的数据 修改ip内容,从而实现近转移和
retf—pop ip; pop cs 实现远转移返回
例子 call 和 ret
call和ret 解决问题 套路;第二个ret返回的时候返回到第一个call的当时的ip所指向的指令–即第一个call下面的指令
调用子程序call 逐步返回
计算2的n次
为call ret 指令 设置栈
call以后压栈ip
改ip
乘法 mul bl 对比 除法只用给出 除数
汇编语言的模块化程序设计–参数和结果的传递问题
常用 寄存器存 参数和结果
内存单元批量传递数据
也很常用 栈 传递参数 压栈 弹栈
寄存器冲突问题—编写子程序避免冲突寄存器—方案:在子程序的开始,将要用的寄存器的内容都保存起来,子程序返回前再恢复