1.85k likes | 2.01k Views
第 3 章 汇编语言程序设计. 3.1 概述 指令: 计算机完成某种操作的命令 程序: 完成某种功能的指令序列 软件: 各种程序总称 机器代码,汇编语言程序,汇编程序 汇编语言程序建立步骤: (1)用编辑程序建立 .ASM 源文件 (2)用 LINK 程序把 .ASM 文件转换为 OBJ 文件 (3)用 LINK 程序把 .OBJ 文件转换为 .EXE 文件,或用 EXE 2 BIN 程序把 .EXE 文件转换为 .COM 文件 (4)在 DOS 下直接键入 .EXE 文件或 .COM 文件的文件名就可运行该程序. 3.2 语句格式.
E N D
第3章汇编语言程序设计 3.1 概述 • 指令:计算机完成某种操作的命令 • 程序:完成某种功能的指令序列 • 软件:各种程序总称 • 机器代码,汇编语言程序,汇编程序 • 汇编语言程序建立步骤: • (1)用编辑程序建立.ASM源文件 • (2)用LINK程序把.ASM文件转换为OBJ文件 • (3)用LINK程序把.OBJ文件转换为.EXE文件,或用EXE2BIN程序把.EXE文件转换为.COM文件 • (4)在DOS下直接键入.EXE文件或.COM文件的文件名就可运行该程序
3.2 语句格式 • 语句格式:[名字] 操作符 操作数1,操作数2 ;[注释] 1.名字 • 一种符号地址 • 组成:A~Z,a~z,0~9,专用符号?、.、@、_、$ • 限制:①第一个字符不能为数字 ②“.”必须为第一个字符 ③前31个字符有效 ④不能为关键字 • 类型: 标号:指令符号地址 变量:数据符号地址 2.操作符 • 组成:CPU指令,伪指令,宏指令 3.操作数 • 指定参与操作的数据,或数据所在单元地址 4.注释 • 说明程序、指令功能,增加程序可读性
3.3 伪指令 • 功能:指示汇编程序完成规定的操作,如选择处理器,定义数据,分配存储器等。
一、程序开始与结束 1.程序开始:可以用name,title给程序起名。 • 格式:NAME module_name • 汇编程序以模块名作为模块的名字,若未使用NAME,则可用TITLE给程序指定标题 • 格式:TITLE text • 文本在每一页上打印出来,若没有NAME,则text的前6个字符为模块名,text最多为60个字符。 • 若未使用NAME、TITLE,则源文件名为模块名。 2.程序结束:表示原程序结束,不可缺,源程序的最后一条语句。 • 格式:END [label] • 标号指示程序开始执行的起始地址,多个模块连接,主程序用标号,其他程序不用,主程序缺省值为代码段第一条指令。 3.MASM 6.0 定义的入口点、出口点 • 入口点:.STARUP;产生设置DS、SS、SP代码,此时,END不用标号。 • 出口点:.EXIT;返回操作系统,常用值为0。 • 例: .STARUP … .EXIT 0 END
二、处理器选择 • 功能:选择对应的指令集,也即对应的汇编执行语句集 • 放在程序最前面 • 缺省值为.8086 • 此类指令主要有: • .8086 选择8086指令系统 • .286 选择80286指令系统 • .286P 选择保护方式下80286指令系统 • .386 选择80386指令系统 • .386P 选择保护方式下80386指令系统 • .486 选择80486指令系统 • .486P 选择保护方式下80486指令系统 • .586 选择Pentium指令系统 • .586P 选择保护方式下Pentium指令系统
吉林大学远程教育学院 微机原理及汇编语言 主讲人: 赵宏伟 教授 总学时: 80 吉林大学计算机科学与技术学院 第 二十 讲
三、段定义 • 段定义:确定代码组织与数据存储的方式 • 2种:完整的段定义和简化的段定义(MASM 5.0以上) • 完整的段定义包括: (1)segment和end段定义 (2)ASSUME段分配 (3)GROUP 段组定义
segment和end段定义 (1) • 格式: 段名 segment [定位类型][组合类型] [字长类型][‘类别’] … … 段名 end • 功能:定义段名、段属性。 • 一般情况下,选项可以不用,用默认值,但若需连接本程序和其他程序,就要使用这些说明。 • 段名是段的标识符,指明段的基址,由程序员指定。
segment和end段定义 (2) ①定位类型 • 定位类型:指定段起始边界,5种 • BYTE:任意位置 • WORD:偶地址,地址低1位为0 • DWORD:4的倍数地址,地址低2位为0 • PARA: 16的倍数地址,地址低4位为0 • PAGE: 256的倍数地址,地址低8位为0,一页的起点,默认值。
segment和end段定义 (3) ②组合类型 • 组合类型:表示本段与其它段之间,具有相同段名的各段的组合关系,为连接程序提供信息,属于连接类型,6种。 • PUBLIC:本段连接时将与有相同段名.public类型的其它段连接在一起,连接次序由连接命令指定(共用一个段),即同名段连接在一起,有共同段地址。 • STACK:用于说明堆栈段,把不同程序段中的具有SARCK类型的同名段组合而形成一个堆栈段,其长度为各原有段的总和,LINK自动将新段的段地址送SS,长度送SP,若未定义SARCK类型,需在程序中用指令设置SS、SP。 • COMMON:本段连接时,使具有COMMON类型的同名段具有同一个起始地址,所以会产生覆盖,新段的长度是最长COMMON段的长度,新段的内容取决于依次覆盖的最后内容。 • MEMORY:表示该段应定位在所有段的最下面(即地址最大的区域),如果模块中不止一个MEMORY段,以第一个遇到的作为MEMORY段,其它段作为COMMON段处理,而LINK程序在处理MEMORY时与PUBLIC同样对待。 • PRIVATE:独立段,与其它段逻辑上没有关系,不与同名段合并,默认值。 • AT 表达式:指定本段起始地址为“表达式”,偏移量为0,不能用于代码段。
segment和end段定义 (4) ③字长类型 • 字长类型:386以后,说明使用16位寻址方式,还是32位寻址方式。 • .USE16: 16位寻址方式,段长≤64KB,16位段地址,16位偏移量,默认值。 • .USE32: 32位寻址方式,段长≤4GB,16位段地址,32位偏移量。 ④类别 • 类别:引号括起的字符串,连接时,’类别’相同的分段(他们可能不同名)均放在连续的存储空间中,但他们仍然是不同的分段(连续空间)。
ASSUME段分配 • 格式:ASSUME 段寄存器名:段名,…… • 功能:指定分段寄存器,说明哪个段使用哪个段寄存器。 • 说明: • ①程序段必须用CS,堆栈段必须用SS • ②该语句一般放在代码段的最前面 • ③说明性语句,除CS外(初始化赋值),各段寄存器在程序中赋值。 • ④取消语句:ASSUME NOTHING
一般汇编格式举例 DATA1 SEGMENT ‘DATA’ … DATA1 ENDS DATA2 SEGMENT ‘EXTRA’ … DATA2 ENDS DATA3 SEGMENT ‘DATA’ … DATA3 ENDS CODE SEGMENT ‘CODE’ ASSUME CS:CODE,DS:DATA1,ES:DATA3,SS:DATA2 START: MOV AX, DATA1 MOV DS, AX ;数据段地址赋给DS MOV AX, DATA2 MOV SS, AX ;堆栈段地址赋给SS MOV AX, DATA3 MOV ES, AX ;附加段地址赋给ES … MOV AH, 4CH INT 21H ;返回DOS CODE ENDS END START
GROUP 段组定义 • 格式:段组名 GROUP 段名[,段名] • 功能:将指定的所有段分配在同一个物理存储器内,使用同一个组名,使用同一个DS内容。 • 用户自行指定段组中的段,段组不影响各段次序,对定义在不同段中的变量,可以用同一个DS访问,但各段仍为独立段,通常将具有相同性质的段分在一个段组。 • 举例:DATA1 SEGMENT ‘DATA’ … DATA1 ENDS DATA2 SEGMENT ‘DATA’ … DATA2 ENDS AA5 GROUP DATA1, DATA2 CODE SEGMENT ‘CODE’ ASSUME CS:CODE,DS:AA5 START: MOV AX, AA5 MOV DS, AX ;数据段地址赋给DS … MOV AH, 4CH INT 21H ;返回DOS CODE ENDS END START
简化的段定义 • MASM 5.0以上支持的段定义,不像SEGMENT定义得那么完善,但易用。 • 简化段有利于汇编语言程序模块与高级语言程序模块的连接,但.COM程序不能用简化段定义。
四、地址计数器伪指令 1.地址计数器$ • 功能:指出汇编地址,是偏移量,记载下一个变量或指令在当前段中的偏移量。 • 每个段开始时,$=0,随着汇编过程的进行而增值,每处理一条指令,$增加一个值,此值为该指令所需的字节数。 • 允许直接引用$,如:JNE $+6 ;转向JNE指令的首地址加上6。 • $用于指令时,表示本条指令的第一个字节地址,$用于其他情况,表示$的当前值。 2.ORG 起始地址定义 • 格式:ORG 表达式 • 功能:定义指令或数据的起始地址,把表达式的值送给$(地址计数器) 3.EVEN 偶数地址定义 • 功能:使下一个变量或指令从偶数地址开始,便于字存储对准(EVEN在代码段中可能多出一个NOP语句)。 4.ALIGN 边界定义 • 格式:ALIGN n;n为2的幂次 • 功能:使下一个变量或指令从n的接续整数倍地址开始,保证双字、四倍字对准。
五、数据定义 • 格式:[变量名] 操作符 操作数 [;注释] • 功能:为操作数分配存储单元,用变量与存储单元联系。为变量分配存储单元,并预置初值。 • 操作符: DB:一个操作数占有1个字节单元(8位),定义的变量为字节变量。 DW:一个操作数占有1个字单元(16位),定义的变量为字变量。 DD:一个操作数占有1个双字单元(32位),定义的变量为双字变量。 DF:一个操作数占有1个三字单元(48位),定义的变量为三字变量。 DQ:一个操作数占有1个四字单元(64位),定义的变量为四字变量。 DT:一个操作数占有1个五字单元(80位),定义的变量为五字变量。 • 操作数:常数、表达式、字符串、?
数据定义举例(1) ORG 200H ;设置$ DATA1 DB 12H,2+6,34H EVEN ;偶地址,使$指向偶地址 DATA2 DW 789AH ALIGN 4 ;4倍地址,使$指向4倍地址 DATA3 DD 12345678H DATA4 DW $,6699H ;$为汇编指针,16位,设置当前$(原$)的内容
吉林大学远程教育学院 微机原理及汇编语言 主讲人: 赵宏伟 教授 总学时: 80 吉林大学计算机科学与技术学院 第 二十一 讲
数据定义举例(2) ORG 100H DATA1 DB ‘abcd’ ;字符串必须用单引号 DATA2 DB ‘AB’ DATA3 DW ‘AB’ ;按字处理,个数只能为≤2
数据定义举例(3) ORG 400H DATA1 DB 1,2,?,4 ;按字节定义 DATA2 DW 5,?,6 ;按字定义 DATA3 DF ? ;按三字定义 DATA4 DB 8
数据定义举例(4) ORG 300H DATA1 DB 2 DUP (12H,34H,56H)
数据定义举例(5) ORG 100H DATA1 DB 12H,34H,2 DUP (56H,3 DUP(9AH),78H)
六、PROC、ENDP过程定义 • 功能:用于定义子程序结构,过程名是CALL的操作数。 • 格式: 过程名 PROC [属性] … 过程名 ENDP • 属性:FAR,NEAR(默认值)
吉林大学远程教育学院 微机原理及汇编语言 主讲人: 赵宏伟 教授 总学时: 80 吉林大学计算机科学与技术学院 第 二十二 讲
七、模块连接伪指令 • 用于定义各模块之间的共享信息 1.PUBLIC • 格式:PUBLIC 符号1[,符号2,…] • 功能:公共引用,说明本模块定义,而其它模块引用的共享信息。 2.EXTRN • 格式:EXTRN 符号1:类型[,符号2:类型,…] • 功能:外部引用,说明其他模块定义,而本模块引用的共享信息。 • 类型: 对于变量,可以是字节(BYTE),字(WORD),双字(DWORD),三字(FWORD),四字(QWORD),五字(TWORD)。 对于标号、过程名,可以是段内引用型(FAR),段间引用型(NEAR)。 • 共享信息是全局变量,包括常量、变量、标号、过程名等。 • EXTRN说明的信息应是在PUBLIC中已经定义的,否则出错。 • 例: PUBLIC VAR1, VAR2 EXTRN VAR1:WORD, VAR2:BYTE
3.4 操作数字段 • 操作数字段可以是寄存器、标号、变量、常数、表达式等。寄存器、标号、变量已作介绍,本节重点介绍常数、表达式。
一、常数(1) • 包括:数值常数、字符串常数、符号常数 1.数值常数 • 数值常数可以是二进制数、八进制数、十进制数、十六进制数。 • 基数控制伪指令:改变基数默认值(原默认值为十进制)。 • 格式:.RADIX 数值表达式 • 功能:把默认的基数改变为2~16范围内的任何基数。 • 例: MOV BX, 0FFH等价于 .RADIX 16 MOV BX, 178 MOV BX, 0FFH MOV BX,178D 2.字符串常数 • 字符串常数:包括在单引号中的若干字符。 • 字符串在存储器中储存的是相应字符的ASCII码。
一、常数(2) 3.符号常数 • 包括:EQU和= (1)EQU赋值伪指令 • 格式:符号常数名 EQU 表达式 • 功能:将表达式的值赋给符号常数。 • 说明:表达式可以是有效的操作数格式,也可以是任何可求出数值常数的表达式,还可以是任何有效的符号(如操作符、寄存器名、变量名等)。 • EQU定义的一个符号常数名在程序中只能定义一次。 • 例:DATA1 EQU 88 NEW_CX EQU CX DATA2 EQU DATA1+12 (2)=伪指令 • 格式:符号常数名 = 表达式 • 功能:将表达式的值赋给符号常数。 • =定义的一个符号常数名在程序中可以重复定义多次。 • 例:… DATA1 = 88 … DATA1 =DATA1+99
二、表达式 (1) • 表达式:常数、寄存器、标号、变量与一些运算符相组合的序列。 • 包括:数值表达式,地址表达式。 1.运算符 • 六种运算:算术运算、逻辑运算、移位运算、关系运算、返回值运算、属性运算。 (1)算术运算符 • 算术运算符:有5个,加(+)、减(-)、乘(×)、除(/)和取余(MOD)。 (2)逻辑运算符 • 逻辑运算符:4个,与(AND)、或(OR)、非(NOT)和异或(XOR)。
二、表达式 (2) (3)移位运算符 • 移位运算符:2个,左移(SHL)和右移(SHR)。 • 例: MOV AL, 0 MOV BL, 11011000B MOV AL, BL SHR 3 ; (AL)=00011011B MOV CL, BL SHL 6 ; (CL)=11000000B (4)关系运算符 • 关系运算符:6个,等于(EQ)、不等(NE)、小于(LT)、大于(GT)、小于等于(LE)、大于等于(GT)。 • 功能:关系运算符的两个操作数的计算结果应为逻辑值,结果为真(关系成立),表示为0FFFFH,结果为假(关系不成立),表示为0。 • 例: MOV AX, 2 LT 7 ; (AX)=0FFFFH
二、表达式 (3) (5)返回值运算符 • 返回值运算符:5个,返回变量或标号的段地址(SEG)、返回变量或标号的偏移地址(OFFSET)、返回变量或标号的类型值(TYPE)、返回变量的单元数(LENGTH)、返回变量的字节数(SIZE)。 ①SEG返回变量或标号的段地址运算符 • 格式:操作数 SEG 变量/标号 • 功能:将变量/标号所在段的段基址值赋给操作数。 ②OFFSET返回变量或标号的偏移地址运算符 • 格式:操作数 OFFSET 变量/标号 • 功能:将变量/标号所在段中的偏移值赋给操作数。 ③TYPE返回变量或标号的类型值运算符 • 格式:操作数 TYPE 变量/标号 • 功能:将代表变量/标号类型的值赋给操作数。 • 说明:如果是变量,则汇编程序将根据变量对应的数据定义伪指令回送类型值(即变量类型代表的字节数):DB为1,DW为2,DD为4,DF为6,DQ为8,DT为10。返回以字节数表示的类型,常数返回0。如果是标号,则汇编程序将回送代表该标号类型的数值:NEAR为-1,FAR为—2。
二、表达式 (4) ④LENGTH返回变量的单元数运算符 • 格式:操作数 LENGTH 变量 • 功能:将代表变量的单元数赋给操作数。 • 说明:<1>返回一次数据定义的第一个元素的长度,DUP时返回重复次数,其他情况返回1。 • <2>对于变量中使用DUP的情况,汇编程序将回送分配给该变量的单元数(按类型TYPE算),而对于其他情况,则均送1。只对DUP定义的变量有意义,返回分配给该变量的元素的个数。只返回第一个DUP前的元素个数,与DUP括号内的数据无关,认为只是一组数据而已,若与DUP并列地定义了其它数据,就只能返回1。 ⑤SIZE返回变量的字节数运算符 • 格式:操作数 SIZE 变量 • 功能:将代表变量的字节数赋给操作数。 • 说明:<1>就是返回LENGTH×TYPE的结果。 • <2>汇编程序将回送分配给该变量的字节数。只对DUP定义的变量有意义。
吉林大学远程教育学院 微机原理及汇编语言 主讲人: 赵宏伟 教授 总学时: 80 吉林大学计算机科学与技术学院 第 二十三 讲
二、表达式 (5) 例: DATA SEGMENT AT 1000H ORG 3000H AA1 DW 100 DUP(0) BB1 DW 1,2 CC1 DB ‘ABCD’ DD1 DW 1000 DUP(2,3) EE1 DB 50 DUP(5,6) FF1 DW 1,2,100 DUP(?) GG1 DD 5 DUP(6 DUP(?)) DATA ENDS CODE SEGMENT ASSUME CS:CODE, DS:DATA HH1: MOV AX, DATA ; AX=1000H MOV DS, AX MOV AX, SEG AA1 ; AX=1000H,AT定义 MOV BX, OFFSET AA1 ; BX=3000H MOV CL, TYPE AA1 ; CL=2,字类型 MOV CH, TYPE CC1 ; CH=1,字节类型 MOV AL, TYPE GG1 ; AL=4,双字类型
二、表达式 (6) MOV DX, LENGTH AA1 ; DX=100,元素个数 MOV AX, SIZE AA1 ; AX=200,元素个数×类型 MOV DX, LENGTH BB1 ; DX=1,LENGTH只对DUP定义的变量有意义 MOV AX, SIZE BB1 ; AX=2 MOV DX, LENGTH CC1 ; DX=1 MOV AX, SIZE CC1 ; AX=1 MOV DX, LENGTH DD1 ; DX=1000 MOV AX, TYPE DD1 ; AX=2000 MOV DX, LENGTH EE1 ; DX=50 MOV AX, SIZE EE1 ; AX=50 MOV DX, LENGTH FF1 ; DX=1 MOV AX, TYPE FF1 ; AX=2 MOV DX, LENGTH GG1 ; DX=5 MOV AX, TYPE GG1 ; AX=20 … MOV AH, 4CH INT 21H CODE ENDS END HH1
二、表达式 (7) (6)属性运算符 • 属性运算符:3个,临时改变类型属性运算符PTR、指定类型属性运算符THIS、定义类型属性运算符LABEL。 ① PTR 临时改变类型属性运算符 • 格式:类型 PTR 变量/标号 • 功能:将PTR前面的类型临时赋给变量/标号,而原有段属性和偏移属性保持不变,其本身并不分配存储单元。 • 说明:对于变量,可以指定类型BYTE、WORD、DWOR、DFWORD、QWORD、TWORD。对于标号,可以指定类型NEARFAR • 例: DATA DB 66H,77H MOV AX, WORD PRT DATA
二、表达式 (8) ② THIS 指定类型属性运算符 • 格式:变量/标号 EQU THIS 类型 • 功能:将变量或标号定义成指定的类型。 • 说明:THIS指定的变量或标号本身并不分配存储单元,它与紧跟其后的变量或标号只有类型不同,而段地址和偏移量均相同。THIS指定类型与PTR相同。 • 例: DATA1 EQU THIS BYTE DATA2 DW 1234H ;DATA1和DATA2具有相同的段地址和偏移量,但类型值分别为1和2。 MOV AX, DATA2 ; AX=1234H MOV BL, DATA1 ; BL=34H
二、表达式 (9) ③ LABEL 定义类型属性运算符 • 格式:变量/标号 LABEL 类型 • 功能:将变量或标号定义成指定的类型。 • 说明:LABEL指定的变量或标号本身并不分配存储单元,它与紧跟其后的变量或标号只有类型不同,而段地址和偏移量均相同。THIS指定类型与PTR相同。 • 例: AA1 LABEL FAR ; AA1为段间转移入口 AA2: …; AA2为段内转移入口 … AA3 LABEL BYTE AA4 DW 1234H MOV AX, AA4 MOV BH, AA3+1
二、表达式 (10) 2.数字表达式 • 数字表达式:有常数、变量、标号与一些运算符相组合的序列。运算符可以是算术运算符、逻辑运算符、移位运算符、关系运算符、返回值运算符,但结果必须是常数。 3.标号 • 标号:指令所在单元的符号地址。 • 标号的三种属性:段地址、偏移量、类型(NEAR、FAR)。 4.变量 • 变量:数据所在单元的符号地址。 • 变量的五种属性:段地址(SEG返回值)、偏移量(OFFSET返回值)、类型(TYPE返回值)、单元数(LENGTH返回值)、字节数(SIZE返回值) 5.地址表达式 • 地址表达式:存储器地址,即EA的计算。是常数、变量、标号与一些运算符相组合的序列。
吉林大学远程教育学院 微机原理及汇编语言 主讲人: 赵宏伟 教授 总学时: 80 吉林大学计算机科学与技术学院 第 二十四 讲
3.5 汇编语言程序设计及举例(1) (一) 编写汇编语言程序的步骤 • 1.从实际问题抽象出数学模型。 • 2.确定解决此数学模型的算法。解决同一个问题可以有不同的算法。它们的效率可能有很大的差别。例如要做X*10,可以用乘法指令;也可以用X*8+X*2,而X*2或X*8也可以自身相加,或X左移来实现;这些方法的程序复杂程度和执行时间差别是很大的。又例如查表,是用线性查找还是用对分查找区别也很大。所以,确定合适的算法是很重要的。 • 3.画出程序流程图。把根据算法解决问题的思路和方法,用图形表示出来。 • 4.分配内存工作单元和寄存器。 • 5.根据流程图编制程序。 • 当然,到这儿只是设计出了基本程序,此程序是否正确,可靠,还必须上机调试,排错和进行不要的检测。 (二) 判断程序质量的标准 • 为解决同一个问题所编制的程序,往往是多种多样的,如何衡量程序的质量呢?通常有三个标准: 1.程序的执行时间 2.程序所占用的内存字节数 3.程序的语句行数 • 前两个标准是主要的,由于半导体存储器容量越来越大,成本急剧降低。
3.5 汇编语言程序设计及举例(2) (三) 程序流程图 • 在确定问题的算法以后,先不要急于写一条条指令,而要用程序流程图把编制程序的方法和思路勾画出来,确定程序的结构和相互之间的关系。本书中的流程图,采用以下一些惯用的画法。 1.用方框表示工作框,方框中用简明的语言标明所完成的特定功能。它有一个入口一个出口,用箭头表示。 2.用菱形表示判断框,菱形内标明比较,判断和条件。它有一个入口和几个出口,各用箭头表示。在各个出口处标明出口条件,条件成立则写“是(用Y表示)”,条件不成立用“否(用N表示)”。 3.程序中要调用的子程序或过程,用 框表示,在框中标明子程序或过程的名字(包括入口地址、入口条件、参数、出口参数)。它有一个入口一个出口,各用箭头表示。 • 带箭头的直线。程序的各框之间用箭头的直线连接起来,表示程序的走向。
算术运算程序设计(直线运行程序) • 最简单的程序是没有分支,没有循环的直线运行程序。 • 在8088/8086中,数据是16位的,它只有16位的运算指令,若是两个32位的数相乘就无法直接用指令实现(在80386中有32位数相乘的指令),但可以用16位乘法指令做4次乘法,然后把部分积相加来实现。其原理如图所示。
算术运算程序设计(1) • 例1: 两个32位无符号数乘法程序 • 若数据区中已有一个缓冲区存放了32位的被乘数和乘数,保留了64位的空间以存放乘积,能实现上述运算的程序流程图如图所示
算术运算程序设计(2) 相应的程序为: name 32bit mutipty data segment mulnum dw 0000,0ffffh,0000,0ffffh, 4 dup(?) data ends stack segment para stack ‘stack’ db 100 dup(?) stack ends code segment assume cs:code, ds:data, ss:stack,es:data start proc far begin: push ds ;DS中包含的是程序段前缀的起始地址 mov ax, 0 push ax ;设置返回至DOS的段值和IP值 mov ax, data mov ds, ax mov es, ax ;置段寄存器初值 lea bx, mulnum mulu32: mov ax, [bx ] ;B->AX
算术运算程序设计(3) mov si, [bx+4] ;D->SI mov di, [bx+6] ;C->DI mul si ;B×D mov [bx+8],ax ;保存部分积I mov [bx+0ah], dx mov ax.,[bx+2] ;A->AX mul si ;A×D add ax,[bx+0ah] adc dx,0 ;部分积2的一部分与部分积1的相应部分相加 mov [bx+0ah],ax mov [bx+0ch],dx ;保存 mov ax, [bx] ;B->AX mul di ;B×C add ax,[bx+0ah] ;与部分积3的相应部分相加 adc dx,[bx+0ch]
算术运算程序设计(4) mov [bx+0ah],ax mov [bx+0ch],dx pushf ;保存后一次相加的进位位 mov ax,[bx+2] ;A->AX mul di ;A×C popf adc ax,[bx+0ch] ;与部分积4的相加部分相加 adc dx,0 mov [bx+0ch],ax mov [bx+0eh],dx ret start endp code ends end begin
吉林大学远程教育学院 微机原理及汇编语言 主讲人: 赵宏伟 教授 总学时: 80 吉林大学计算机科学与技术学院 第 二十五 讲
算术运算程序设计(5) • 例2: 32位符号数乘法 • 在32位无符号数乘法程序的基础上很容易实现32位带符号数的乘法。 • 首先设一个乘积的符号标志初值为0;检查被乘数,若为负,一方面对被乘数取补,另一方面对符号标志取反; • 再检查乘数,若是负数也对乘数取补和符号标志取反;然而调用32位无符号数乘法程序。 • 最后检查乘积符号标志,若为负(即两个异号数相乘),则对64为乘积取补。 • 程序流程图如图所示。