焦点网站设计,厦门教育平台网站建设,赣州九一人才网找工作,广告设计属于什么行业目录
一、伪指令
二、程序返回
三、汇编语言结构 四、[...]的规定和(...)的约定
五、Loop指令 一、伪指令 在汇编语言源程序中#xff0c;包含两种指令#xff0c;一种时汇编指令#xff0c;一种是伪指令。汇编指令是有对应的机器码的指令#xff0c;可以被编译为机器指…目录
一、伪指令
二、程序返回
三、汇编语言结构 四、[...]的规定和(...)的约定
五、Loop指令 一、伪指令 在汇编语言源程序中包含两种指令一种时汇编指令一种是伪指令。汇编指令是有对应的机器码的指令可以被编译为机器指令最终为cpu所执行。伪指令没有对应的机器指令最终不被cpu所执行。
assume cs:codesgcodesg segmentmov ax, 0123Hmow bx, 0456Hadd ax,bxmov ax,4c00Hint 21H
codesg ends
end
(1) segment 和 ends 段名 segment 段体内容 段名 ends segemt用于定义一个逻辑段的开始 ends用于定义一个逻辑段的结束。它告诉汇编器程序的某一部分将被组织为一个段该段可以是代码段、数据段或堆栈段。
2end end是一个汇编程序的结束标记。若程序结尾处不加end编译器在编译程序时无法知道程序在何处结束。
3assume assume 段寄存器: 段名 assume 伪指令用于将特定用途的段与相关的段寄存器关联起来。它告诉汇编器在访问段内变量时应该使用哪个段寄存器。
二、程序返回
mov ax, 4c00h
int 21h 这两条指令的作用是安全退出程序并返回到 DOS 的控制台。这是大多数汇编语言程序的结尾部分用于确保程序在执行完毕后不会继续运行或占用资源。
三、汇编语言结构
1在debug中直接编写汇编程序
可以直接在命令行中输入汇编指令无需编写复杂的源文件格式。这种方式适合功能简单、短小精悍的程序在debug中直接执行、调试和修改程序无需经过编译和链接过程调试效率高 2单独编写源文件后通过编译器生成可执行文件
源文件可以使用文本编辑器编写便于组织和管理适合编写复杂、大型程序编译器可以对源代码进行优化生成更高效的机器码编译器可以识别并处理伪指令帮助程序员组织程序结构通过编译器生成的可执行文件可以在不同平台上运行只要目标平台支持相应的编译器和链接器
特性在DEBUG中直接编写单独编写源文件后编译适用场景简单、短小程序复杂、大型程序是否需要伪指令否是调试方式直接调试需要编译、链接后调试代码效率低高环境依赖DOS环境现代操作系统学习成本低高适合开发阶段初期快速验证中后期结构化开发 四、[...]的规定和(...)的约定
1[...]——表示一个内存单元 一个完整的内存单元需要两种信息a.内存单元的地址段地址偏移地址b.内存单元的长度或者字节 内存单元的长度可以由具体指令中的其他操作对象比如寄存器指出 [...]的默认地址为ds偏移地址为“...”;
指令段地址偏移地址内存单元长度mov ax[0]DS0字mov al[0]DS0字节mov ax[bx]DSbx寄存器中字mov al[bx]DSbx寄存器中字节 2...——表示一个内存单元或寄存器中的内容为了方便学习做出的约定 “”中的元素可以有3种类型寄存器名、段寄存器名、内存单元的物理地址一个20位的数据
描述对象描述方法ax中的内容为0010H(ax)0010Hmov ax,[2]的功能(ax)((ds)*162)add ax,2功能(ax)(ax)2push ax功能 (sp)(sp)-2 ((ss)*16(sp))(ax) 2000:1000处的内容为0010H(210000H)0010Hmov [2],ax 功能((ds)*162)(ax)add ax,bx功能(ax)(ax)(bx)pop ax的功能 (ax)((ss)*16(sp)) (sp)(sp)2
(3)约定符号idata表示常量 mov ax[idata] 代表mov ax,[1] 、mov ax,[2] 、mov ax,[3] 等 mov axidata 代表mov ax,1]、mov ax,2 、mov ax,3 等 mov dsidata 代表mov ds,1、mov ds,2 、mov ds,3 等为非法指令 4Debug和汇编编译器对指令的不同处理 Debug将[idata]解释为一个内存单元编译器将[idata]解释为idata
任务将内存20000、20001、20002、20003单元中的数据送入alblcl和dl中1在Debug中编程实现
mov ax2000
mov ds,ax
mov al,[0]
mov bl,[1]
mov cl,[2]
mov dl,[3](2)汇编源程序实现
assume cs:code
code segmentmov ax2000mov ds,axmov al,[0]mov bl,[1]mov cl,[2]mov dl,[3] mov ax,4c00hint 21hcode ends
end a.在汇编源程序中如果在“[]”里用一个常量idata直接给出内存单元的偏移地址在“[]”的前面显式地给出段地址所在的段寄存器 b.如果在“[]”里用寄存器则段地址默认为ds可以不显示的给出段地址所在的段寄存器
五、Loop指令
1功能实现循环计数型循环 loop 标号 作用 递减 CX 寄存器在执行 loop 指令时CPU 会自动将 CX 寄存器的值减 1。 判断循环条件如果 CX 不为零则跳转到指定的 标号 处继续执行循环体如果 CX 为零则不跳转继续执行后续指令。 2CPU执行loop指令时要进行的操作 a. cxcx- 1 b.判断cx中的值 不为零则转至标号处执行程序 如果为零则向下执行
3实例程序
assume cscodecode segmentmov ax2mov cx11
sadd ax,axloop smov ax,4c00hint 21h
code ends
end 4loop 指令与 [bx] 的结合使用 [bx] 是一种内存寻址方式表示通过 BX 寄存器中的偏移地址访问内存单元。loop 指令可以与 [bx] 结合使用实现动态访问内存中的数据。 在汇编语言中当我们需要将内存地址 ffff:0 到 ffff:b共 12 个字节中的 8 位数据累加到 16 位寄存器 dx 中时会面临两个关键问题 结果溢出如果直接使用 8 位寄存器 dl 来存储累加结果由于 12 个 8 位数据的总和最大为 12 × 255 3060超过了 dl 的最大值 255因此会导致溢出。 类型不匹配如果尝试将 8 位数据直接加到 16 位寄存器 dx 中由于 dx 是 16 位寄存器而 add 指令要求两个操作数类型一致这种直接相加会导致类型不匹配的问题。
为了解决这两个问题通常采用以下方法 使用 16 位寄存器作为中介将内存中的 8 位数据先加载到 16 位寄存器 ax 中然后将 ax 的内容加到 dx 中。这样可以确保两个操作数的类型一致同时避免溢出。 循环控制使用 loop 指令配合 [bx] 寄存器实现对内存单元的逐个访问和累加从而高效地完成整个累加过程。
实例演示l assume cs:code
code aegmentmov ax,0ffffhmov ds,axmov bx,0 ;初始化dsbx指向ffff:0mov dx,0 ;初始化累加寄存器dxdx0mov cx,12 初始化循环计数寄存器cxcx12s:mov al:[bx]mov ah,0add dx,ax 间接向dx中加上ds*16bx单元的数值inc bx ds:bx指向下一个单元loop smov ax,4c00hint 21h
code ends
end