【汇编语言王爽】学习笔记-p40-p54

2022-11-13 09:52:10 浏览数 (1)

通过点的形式 把立即数写到外面 对比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 对比 除法只用给出 除数

汇编语言的模块化程序设计–参数和结果的传递问题

常用 寄存器存 参数和结果

内存单元批量传递数据

也很常用 栈 传递参数 压栈 弹栈

寄存器冲突问题—编写子程序避免冲突寄存器—方案:在子程序的开始,将要用的寄存器的内容都保存起来,子程序返回前再恢复

0 人点赞