1 / 185

第 3 章 汇编语言程序设计

第 3 章 汇编语言程序设计. 3.1 概述 指令: 计算机完成某种操作的命令 程序: 完成某种功能的指令序列 软件: 各种程序总称 机器代码,汇编语言程序,汇编程序 汇编语言程序建立步骤: (1)用编辑程序建立 .ASM 源文件 (2)用 LINK 程序把 .ASM 文件转换为 OBJ 文件 (3)用 LINK 程序把 .OBJ 文件转换为 .EXE 文件,或用 EXE 2 BIN 程序把 .EXE 文件转换为 .COM 文件 (4)在 DOS 下直接键入 .EXE 文件或 .COM 文件的文件名就可运行该程序. 3.2 语句格式.

tad-simpson tad-simpson
Download Presentation

第 3 章 汇编语言程序设计

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 第3章汇编语言程序设计 3.1 概述 • 指令:计算机完成某种操作的命令 • 程序:完成某种功能的指令序列 • 软件:各种程序总称 • 机器代码,汇编语言程序,汇编程序 • 汇编语言程序建立步骤: • (1)用编辑程序建立.ASM源文件 • (2)用LINK程序把.ASM文件转换为OBJ文件 • (3)用LINK程序把.OBJ文件转换为.EXE文件,或用EXE2BIN程序把.EXE文件转换为.COM文件 • (4)在DOS下直接键入.EXE文件或.COM文件的文件名就可运行该程序

  2. 3.2 语句格式 • 语句格式:[名字] 操作符 操作数1,操作数2 ;[注释] 1.名字 • 一种符号地址 • 组成:A~Z,a~z,0~9,专用符号?、.、@、_、$ • 限制:①第一个字符不能为数字 ②“.”必须为第一个字符 ③前31个字符有效 ④不能为关键字 • 类型: 标号:指令符号地址 变量:数据符号地址 2.操作符 • 组成:CPU指令,伪指令,宏指令 3.操作数 • 指定参与操作的数据,或数据所在单元地址 4.注释 • 说明程序、指令功能,增加程序可读性

  3. 3.3 伪指令 • 功能:指示汇编程序完成规定的操作,如选择处理器,定义数据,分配存储器等。

  4. 一、程序开始与结束 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

  5. 二、处理器选择 • 功能:选择对应的指令集,也即对应的汇编执行语句集 • 放在程序最前面 • 缺省值为.8086 • 此类指令主要有: • .8086 选择8086指令系统 • .286 选择80286指令系统 • .286P 选择保护方式下80286指令系统 • .386 选择80386指令系统 • .386P 选择保护方式下80386指令系统 • .486 选择80486指令系统 • .486P 选择保护方式下80486指令系统 • .586 选择Pentium指令系统 • .586P 选择保护方式下Pentium指令系统

  6. 吉林大学远程教育学院 微机原理及汇编语言 主讲人: 赵宏伟 教授 总学时: 80 吉林大学计算机科学与技术学院 第 二十 讲

  7. 三、段定义 • 段定义:确定代码组织与数据存储的方式 • 2种:完整的段定义和简化的段定义(MASM 5.0以上) • 完整的段定义包括: (1)segment和end段定义 (2)ASSUME段分配 (3)GROUP 段组定义

  8. segment和end段定义 (1) • 格式: 段名 segment [定位类型][组合类型] [字长类型][‘类别’] … … 段名 end • 功能:定义段名、段属性。 • 一般情况下,选项可以不用,用默认值,但若需连接本程序和其他程序,就要使用这些说明。 • 段名是段的标识符,指明段的基址,由程序员指定。

  9. segment和end段定义 (2) ①定位类型 • 定位类型:指定段起始边界,5种 • BYTE:任意位置 • WORD:偶地址,地址低1位为0 • DWORD:4的倍数地址,地址低2位为0 • PARA: 16的倍数地址,地址低4位为0 • PAGE: 256的倍数地址,地址低8位为0,一页的起点,默认值。

  10. 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,不能用于代码段。

  11. segment和end段定义 (4) ③字长类型 • 字长类型:386以后,说明使用16位寻址方式,还是32位寻址方式。 • .USE16: 16位寻址方式,段长≤64KB,16位段地址,16位偏移量,默认值。 • .USE32: 32位寻址方式,段长≤4GB,16位段地址,32位偏移量。 ④类别 • 类别:引号括起的字符串,连接时,’类别’相同的分段(他们可能不同名)均放在连续的存储空间中,但他们仍然是不同的分段(连续空间)。

  12. ASSUME段分配 • 格式:ASSUME 段寄存器名:段名,…… • 功能:指定分段寄存器,说明哪个段使用哪个段寄存器。 • 说明: • ①程序段必须用CS,堆栈段必须用SS • ②该语句一般放在代码段的最前面 • ③说明性语句,除CS外(初始化赋值),各段寄存器在程序中赋值。 • ④取消语句:ASSUME NOTHING

  13. 一般汇编格式举例 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

  14. 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

  15. 简化的段定义 • MASM 5.0以上支持的段定义,不像SEGMENT定义得那么完善,但易用。 • 简化段有利于汇编语言程序模块与高级语言程序模块的连接,但.COM程序不能用简化段定义。

  16. 四、地址计数器伪指令 1.地址计数器$ • 功能:指出汇编地址,是偏移量,记载下一个变量或指令在当前段中的偏移量。 • 每个段开始时,$=0,随着汇编过程的进行而增值,每处理一条指令,$增加一个值,此值为该指令所需的字节数。 • 允许直接引用$,如:JNE $+6 ;转向JNE指令的首地址加上6。 • $用于指令时,表示本条指令的第一个字节地址,$用于其他情况,表示$的当前值。 2.ORG 起始地址定义 • 格式:ORG 表达式 • 功能:定义指令或数据的起始地址,把表达式的值送给$(地址计数器) 3.EVEN 偶数地址定义 • 功能:使下一个变量或指令从偶数地址开始,便于字存储对准(EVEN在代码段中可能多出一个NOP语句)。 4.ALIGN 边界定义 • 格式:ALIGN n;n为2的幂次 • 功能:使下一个变量或指令从n的接续整数倍地址开始,保证双字、四倍字对准。

  17. 五、数据定义 • 格式:[变量名] 操作符 操作数 [;注释] • 功能:为操作数分配存储单元,用变量与存储单元联系。为变量分配存储单元,并预置初值。 • 操作符: DB:一个操作数占有1个字节单元(8位),定义的变量为字节变量。 DW:一个操作数占有1个字单元(16位),定义的变量为字变量。 DD:一个操作数占有1个双字单元(32位),定义的变量为双字变量。 DF:一个操作数占有1个三字单元(48位),定义的变量为三字变量。 DQ:一个操作数占有1个四字单元(64位),定义的变量为四字变量。 DT:一个操作数占有1个五字单元(80位),定义的变量为五字变量。 • 操作数:常数、表达式、字符串、?

  18. 数据定义举例(1) ORG 200H ;设置$ DATA1 DB 12H,2+6,34H EVEN ;偶地址,使$指向偶地址 DATA2 DW 789AH ALIGN 4 ;4倍地址,使$指向4倍地址 DATA3 DD 12345678H DATA4 DW $,6699H ;$为汇编指针,16位,设置当前$(原$)的内容

  19. 吉林大学远程教育学院 微机原理及汇编语言 主讲人: 赵宏伟 教授 总学时: 80 吉林大学计算机科学与技术学院 第 二十一 讲

  20. 数据定义举例(2) ORG 100H DATA1 DB ‘abcd’ ;字符串必须用单引号 DATA2 DB ‘AB’ DATA3 DW ‘AB’ ;按字处理,个数只能为≤2

  21. 数据定义举例(3) ORG 400H DATA1 DB 1,2,?,4 ;按字节定义 DATA2 DW 5,?,6 ;按字定义 DATA3 DF ? ;按三字定义 DATA4 DB 8

  22. 数据定义举例(4) ORG 300H DATA1 DB 2 DUP (12H,34H,56H)

  23. 数据定义举例(5) ORG 100H DATA1 DB 12H,34H,2 DUP (56H,3 DUP(9AH),78H)

  24. 六、PROC、ENDP过程定义 • 功能:用于定义子程序结构,过程名是CALL的操作数。 • 格式: 过程名 PROC [属性] … 过程名 ENDP • 属性:FAR,NEAR(默认值)

  25. 吉林大学远程教育学院 微机原理及汇编语言 主讲人: 赵宏伟 教授 总学时: 80 吉林大学计算机科学与技术学院 第 二十二 讲

  26. 七、模块连接伪指令 • 用于定义各模块之间的共享信息 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

  27. 3.4 操作数字段 • 操作数字段可以是寄存器、标号、变量、常数、表达式等。寄存器、标号、变量已作介绍,本节重点介绍常数、表达式。

  28. 一、常数(1) • 包括:数值常数、字符串常数、符号常数 1.数值常数 • 数值常数可以是二进制数、八进制数、十进制数、十六进制数。 • 基数控制伪指令:改变基数默认值(原默认值为十进制)。 • 格式:.RADIX 数值表达式 • 功能:把默认的基数改变为2~16范围内的任何基数。 • 例: MOV BX, 0FFH等价于 .RADIX 16 MOV BX, 178 MOV BX, 0FFH MOV BX,178D 2.字符串常数 • 字符串常数:包括在单引号中的若干字符。 • 字符串在存储器中储存的是相应字符的ASCII码。

  29. 一、常数(2) 3.符号常数 • 包括:EQU和= (1)EQU赋值伪指令 • 格式:符号常数名 EQU 表达式 • 功能:将表达式的值赋给符号常数。 • 说明:表达式可以是有效的操作数格式,也可以是任何可求出数值常数的表达式,还可以是任何有效的符号(如操作符、寄存器名、变量名等)。 • EQU定义的一个符号常数名在程序中只能定义一次。 • 例:DATA1 EQU 88 NEW_CX EQU CX DATA2 EQU DATA1+12 (2)=伪指令 • 格式:符号常数名 = 表达式 • 功能:将表达式的值赋给符号常数。 • =定义的一个符号常数名在程序中可以重复定义多次。 • 例:… DATA1 = 88 … DATA1 =DATA1+99

  30. 二、表达式 (1) • 表达式:常数、寄存器、标号、变量与一些运算符相组合的序列。 • 包括:数值表达式,地址表达式。 1.运算符 • 六种运算:算术运算、逻辑运算、移位运算、关系运算、返回值运算、属性运算。 (1)算术运算符 • 算术运算符:有5个,加(+)、减(-)、乘(×)、除(/)和取余(MOD)。 (2)逻辑运算符 • 逻辑运算符:4个,与(AND)、或(OR)、非(NOT)和异或(XOR)。

  31. 二、表达式 (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

  32. 二、表达式 (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。

  33. 二、表达式 (4) ④LENGTH返回变量的单元数运算符 • 格式:操作数 LENGTH 变量 • 功能:将代表变量的单元数赋给操作数。 • 说明:<1>返回一次数据定义的第一个元素的长度,DUP时返回重复次数,其他情况返回1。 • <2>对于变量中使用DUP的情况,汇编程序将回送分配给该变量的单元数(按类型TYPE算),而对于其他情况,则均送1。只对DUP定义的变量有意义,返回分配给该变量的元素的个数。只返回第一个DUP前的元素个数,与DUP括号内的数据无关,认为只是一组数据而已,若与DUP并列地定义了其它数据,就只能返回1。 ⑤SIZE返回变量的字节数运算符 • 格式:操作数 SIZE 变量 • 功能:将代表变量的字节数赋给操作数。 • 说明:<1>就是返回LENGTH×TYPE的结果。 • <2>汇编程序将回送分配给该变量的字节数。只对DUP定义的变量有意义。

  34. 吉林大学远程教育学院 微机原理及汇编语言 主讲人: 赵宏伟 教授 总学时: 80 吉林大学计算机科学与技术学院 第 二十三 讲

  35. 二、表达式 (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,双字类型

  36. 二、表达式 (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

  37. 二、表达式 (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

  38. 二、表达式 (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

  39. 二、表达式 (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

  40. 二、表达式 (10) 2.数字表达式 • 数字表达式:有常数、变量、标号与一些运算符相组合的序列。运算符可以是算术运算符、逻辑运算符、移位运算符、关系运算符、返回值运算符,但结果必须是常数。 3.标号 • 标号:指令所在单元的符号地址。 • 标号的三种属性:段地址、偏移量、类型(NEAR、FAR)。 4.变量 • 变量:数据所在单元的符号地址。 • 变量的五种属性:段地址(SEG返回值)、偏移量(OFFSET返回值)、类型(TYPE返回值)、单元数(LENGTH返回值)、字节数(SIZE返回值) 5.地址表达式 • 地址表达式:存储器地址,即EA的计算。是常数、变量、标号与一些运算符相组合的序列。

  41. 吉林大学远程教育学院 微机原理及汇编语言 主讲人: 赵宏伟 教授 总学时: 80 吉林大学计算机科学与技术学院 第 二十四 讲

  42. 3.5 汇编语言程序设计及举例(1) (一) 编写汇编语言程序的步骤 • 1.从实际问题抽象出数学模型。 • 2.确定解决此数学模型的算法。解决同一个问题可以有不同的算法。它们的效率可能有很大的差别。例如要做X*10,可以用乘法指令;也可以用X*8+X*2,而X*2或X*8也可以自身相加,或X左移来实现;这些方法的程序复杂程度和执行时间差别是很大的。又例如查表,是用线性查找还是用对分查找区别也很大。所以,确定合适的算法是很重要的。 • 3.画出程序流程图。把根据算法解决问题的思路和方法,用图形表示出来。 • 4.分配内存工作单元和寄存器。 • 5.根据流程图编制程序。 • 当然,到这儿只是设计出了基本程序,此程序是否正确,可靠,还必须上机调试,排错和进行不要的检测。 (二) 判断程序质量的标准 • 为解决同一个问题所编制的程序,往往是多种多样的,如何衡量程序的质量呢?通常有三个标准: 1.程序的执行时间 2.程序所占用的内存字节数 3.程序的语句行数 • 前两个标准是主要的,由于半导体存储器容量越来越大,成本急剧降低。

  43. 3.5 汇编语言程序设计及举例(2) (三) 程序流程图 • 在确定问题的算法以后,先不要急于写一条条指令,而要用程序流程图把编制程序的方法和思路勾画出来,确定程序的结构和相互之间的关系。本书中的流程图,采用以下一些惯用的画法。 1.用方框表示工作框,方框中用简明的语言标明所完成的特定功能。它有一个入口一个出口,用箭头表示。 2.用菱形表示判断框,菱形内标明比较,判断和条件。它有一个入口和几个出口,各用箭头表示。在各个出口处标明出口条件,条件成立则写“是(用Y表示)”,条件不成立用“否(用N表示)”。 3.程序中要调用的子程序或过程,用 框表示,在框中标明子程序或过程的名字(包括入口地址、入口条件、参数、出口参数)。它有一个入口一个出口,各用箭头表示。 • 带箭头的直线。程序的各框之间用箭头的直线连接起来,表示程序的走向。

  44. 算术运算程序设计(直线运行程序) • 最简单的程序是没有分支,没有循环的直线运行程序。 • 在8088/8086中,数据是16位的,它只有16位的运算指令,若是两个32位的数相乘就无法直接用指令实现(在80386中有32位数相乘的指令),但可以用16位乘法指令做4次乘法,然后把部分积相加来实现。其原理如图所示。

  45. 算术运算程序设计(1) • 例1: 两个32位无符号数乘法程序 • 若数据区中已有一个缓冲区存放了32位的被乘数和乘数,保留了64位的空间以存放乘积,能实现上述运算的程序流程图如图所示

  46. 算术运算程序设计(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

  47. 算术运算程序设计(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]

  48. 算术运算程序设计(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

  49. 吉林大学远程教育学院 微机原理及汇编语言 主讲人: 赵宏伟 教授 总学时: 80 吉林大学计算机科学与技术学院 第 二十五 讲

  50. 算术运算程序设计(5) • 例2: 32位符号数乘法 • 在32位无符号数乘法程序的基础上很容易实现32位带符号数的乘法。 • 首先设一个乘积的符号标志初值为0;检查被乘数,若为负,一方面对被乘数取补,另一方面对符号标志取反; • 再检查乘数,若是负数也对乘数取补和符号标志取反;然而调用32位无符号数乘法程序。 • 最后检查乘积符号标志,若为负(即两个异号数相乘),则对64为乘积取补。 • 程序流程图如图所示。

More Related

哆哆女性网龙凤胎宝宝起名字大全武汉雅庭装饰起名叫皓然寓意如何康熙字典三画的起名吉利字四四方80个家常小炒欧洲杯晋级规则绿化公司的起名林满江的原型是谁给鸡年的宝宝起名问路达意梓起姓名海字的起名大全给闺蜜起什么名字俞姓男宝宝起名形而上学是什么意思惠普u盘格式化工具玫瑰制品公司商标起名驾校从报名起几年有效18p2p.com逍遥法外百度影音公司起名关键字商户起名大全212hh.com朴实无华校园文本能电影给的彭的宝宝起名字开个肉食店起名支付公司名字起名大全陈姓起名字属猪淀粉肠小王子日销售额涨超10倍罗斯否认插足凯特王妃婚姻不负春光新的一天从800个哈欠开始有个姐真把千机伞做出来了国产伟哥去年销售近13亿充个话费竟沦为间接洗钱工具重庆警方辟谣“男子杀人焚尸”男子给前妻转账 现任妻子起诉要回春分繁花正当时呼北高速交通事故已致14人死亡杨洋拄拐现身医院月嫂回应掌掴婴儿是在赶虫子男孩疑遭霸凌 家长讨说法被踢出群因自嘲式简历走红的教授更新简介网友建议重庆地铁不准乘客携带菜筐清明节放假3天调休1天郑州一火锅店爆改成麻辣烫店19岁小伙救下5人后溺亡 多方发声两大学生合买彩票中奖一人不认账张家界的山上“长”满了韩国人?单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#青海通报栏杆断裂小学生跌落住进ICU代拍被何赛飞拿着魔杖追着打315晚会后胖东来又人满为患了当地回应沈阳致3死车祸车主疑毒驾武汉大学樱花即将进入盛花期张立群任西安交通大学校长为江西彩礼“减负”的“试婚人”网友洛杉矶偶遇贾玲倪萍分享减重40斤方法男孩8年未见母亲被告知被遗忘小米汽车超级工厂正式揭幕周杰伦一审败诉网易特朗普谈“凯特王妃P图照”考生莫言也上北大硕士复试名单了妈妈回应孩子在校撞护栏坠楼恒大被罚41.75亿到底怎么缴男子持台球杆殴打2名女店员被抓校方回应护栏损坏小学生课间坠楼外国人感慨凌晨的中国很安全火箭最近9战8胜1负王树国3次鞠躬告别西交大师生房客欠租失踪 房东直发愁萧美琴窜访捷克 外交部回应山西省委原副书记商黎光被逮捕阿根廷将发行1万与2万面值的纸币英国王室又一合照被质疑P图男子被猫抓伤后确诊“猫抓病”

哆哆女性网 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化