Presentation is loading. Please wait.

Presentation is loading. Please wait.

汇编语言程序设计基础 汇编源程序的基本结构形式 ——介绍汇编语言程序设计的常用结构与方法 模块和段

Similar presentations


Presentation on theme: "汇编语言程序设计基础 汇编源程序的基本结构形式 ——介绍汇编语言程序设计的常用结构与方法 模块和段"— Presentation transcript:

1 汇编语言程序设计基础 汇编源程序的基本结构形式 ——介绍汇编语言程序设计的常用结构与方法 模块和段
与大多数高级语言相同的是: 汇编语言是结构化的语言。一个大的汇编源程序可由多个“模块”组成,而每个模块则由一个或多个“段”构成。 与高级语言不同,使用汇编语言编程时需同时使用指令和伪指令。 汇编源程序的基本结构形式 模块和段 一个汇编“模块”可以包含一个或几个长度小于64KB的“段” 8086只有4个段寄存器(CS、DS、SS和ES) CS: 程序段 DS: 数据段 SS: 堆栈段 ES: 附加段(可选)

2 汇编语言程序设计基本上与高级语言程序设计一样,一般步骤:
1 程序设计的基本过程 一、程序设计的一般步骤 汇编语言程序设计基本上与高级语言程序设计一样,一般步骤: 1.分析问题并抽象出数学模型。 2.确定最佳算法。 3.画出程序结构框图和流程图。 4.合理分配内存工作单元和寄存器,并了解I/O接口地址。 5.编程并调试。(有时需要用注释行说明程序,便于阅读和修改。) 模块化设计方法 “自顶向下,逐步细化” 结构化编码方法 顺序、分支、循环三种基本结构 二、评价程序质量的标准 1.合理组织数据,发挥存贮器、Reg的作用。 2.程序逻辑结构好,便于二次开发。 3.可读性强。 4.高可靠性和可维护性。 5.效率高(代码少)。

3 2 程序的基本结构 三种基本结构奠定了实现任何复杂程序的基础。 一、顺序结构 ——对应简单程序,顺序执行,无转移、无循环。指令指针IP值线性增加。 二、分支结构 ——依据不同条件分支到各程序段,有双分支和多分支两种。IP值受标志位的影响而跳变。 顺序结构 分支结构 两个分支 Y N 分支结构 三个分支 三、循环结构 ——实现那些 需要重复做的工作。IP值因计数器CX中的值不为零而循环。

4 循环结构 循环初始设置 循环初始设置 N 循环条件判断? 循环体 Y 循环体 N 循环条件判断? Y 直到型循环 当型循环
(当条件成立进入循环) 循环初始设置 循环体 循环条件判断? Y N Y N 循环初始设置 循环体 循环条件判断? 直到型循环 (直到条件成立退出循环)

5 一、顺序结构程序设计 ——按事件发展的先后,选择合适的指令有序地加以组合。 例1 用8086CPU的指令实现Y=(X1+X2)/2的程序设计 (1)明确任务,确定算法。 (2)绘流程图

6 取变量X1送AL 取变量X2送AL 计算X1+X2送AX 结果送Y 计算AX/2 结束 开始 图5-3 例5-1流程图

7 (3)根据流程图编写汇编语言程序 1 DATA SEGMENT 2 X1 DB ? 3 X2 DB ? 4 Y DW ?
5 DATA ENDS 6 CODE SEGMENT ASSUME CS:CODE, DS:DATA, 8 MAIN PROC FAR ;设置远程调用子程序 9 START: PUSH DS ;将DS:0压入堆栈 MOV AX, 0

8 PUSH AX MOV AX, DATA ;为DS设置段值 MOV DS, AX MOV AL, X ;取变量X1送AL MOV BL, X ;取变量X2送BL ADD AL, BL ADC AH, ;X1+X2+进位送AX SAR AX, 1 MOV [Y], AX ;结果送Y RET 21 MAIN ENDP 22 CODE ENDS END START

9 例5-2 将一位十六进制数转换成与它相应的 ASCⅡ码。 (1)明确任务,确定算法。 (2)绘流程图(图5-4) 开始 BX←表起始地址
例5-2 将一位十六进制数转换成与它相应的 ASCⅡ码。 (1)明确任务,确定算法。 (2)绘流程图(图5-4) BX←表起始地址 AL←HEX AL←((BX)+(AL)) ASCI←AL 开始 结束

10 (3)根据流程图编写汇编语言程序 DATA SEGMENT TABLE DB 30H,31H,32H,33H,34H,35H,36H,37H DB 38H,39H,41H,42H,43H,44H,45H,46H HEX DB 8 ASC DB ? DATA ENDS COSEG SEGMENT ASSUME CS:COSEG,DS:DATA BEING: MOV AX,DATA MOV DS,AX

11 MOV BX, OFFSET TAB MOV AL,HEX XLAT MOV ASC,AL MOV AH,4CH INT 21H COSEG ENDS END BEING

12 (BX)<= X*X (AX)<= Y/5 Z <=(BX)-(AX)
PUSH DS SUB AX, AX PUSH AX MOV AX, DAT MOV DS, AX 例:编程计算表达式Z = X2-Y/5的值,其中X、Y为带符号字节整数,Z为带符号字整数。 MOV AL, X IMUL AL MOV BX, AX (BX)<= X*X (AX)<= Y/5 Z <=(BX)-(AX) 开 始 结束 MOV AL, Y CBW MOV CL, 5 IDIV CL SUB BX, AX MOV Z, BX RET

13 程 序 DAT SEGMENT X DB 10 DAT ENDS ASSUME DS: DAT, CS: COD
程 序 ;-- 数据段定义 DAT SEGMENT X DB 10 Y DB - 20 Z DW ? DAT ENDS ;-- 代码段定义 COD SEGMENT ASSUME DS: DAT, CS: COD MAIN PROC FAR PUSH DS ; 固定格式返回DOS系统 SUB AX, AX PUSH AX MOV AX, DAT MOV DS, AX ; 初始化DS

14 程 序(续) ; MOV AL, X IMUL AL MOV BX, AX ; (BX)<= X*X ; MOV AL, Y CBW ; 将被除数扩展为字数据 MOV CL, 5 IDIV CL CBW ; (AX)<= Y/5 ; SUB BX, AX MOV Z, BX ; Z <= (BX)-(AX) ; RET ; 过程结束,返回DOS MAIN ENDP COD ENDS END MAIN

15 思考题:压缩BCD码分解为非压缩BCD码。
例2:将某段中的字符串“Hello!”传送到另一段中(内存数据块 的传送)。 开始 建立传送方向 DS: SI 源串首地址 ES: DI ←目的串首地址 CX 串长度 串传送 返回 DOS 利用变量定义字符串和缓冲区 思考题:压缩BCD码分解为非压缩BCD码。

16 aa SEGMENT ;数据段1 xx DB 'Hello!’ ;定义源串 aa ENDS bb SEGMENT ;数据段2 yy DB 6 dup (?) ; 定义目的缓冲区 bb ENDS cc SEGMENT ;代码段 ASSUME CS:cc, DS:aa, ES:bb ;指示指令中标号、变量所在段 start : CLD ;设置传送方向 MOV AX , aa ;DS: SI ← 源串首地址 MOV DS , AX LEA SI , xx MOV AX , SEG yy ;ES:DI ← 目的首地址 MOV ES , AX MOV DI , OFFSET yy MOV CX , ;CX ← 串的长度 REP MOVSB ;串传送 MOV AH , 4CH ;调用4CH系统功能,返回DOS INT H cc ENDS END start ;指示程序结束和程序入口

17 设计分支程序的关键: ① 如何判断分支的条件 ② 如何实现分支结构 1. 利用比较和转移指令实现分支
第4章 汇编语言程序设计 二、分支结构程序的设计 设计分支程序的关键: ① 如何判断分支的条件 ② 如何实现分支结构 1. 利用比较和转移指令实现分支 方法:在需要分支的地方用比较指令CMP、串比较指令CMPS 或串搜索指令SCAS等,进行分支条件的比较判断, 再利用各种条件转移指令实现分支。 例1:编程实现下列函数的功能,其中X、Y为无符号字节数。

18 流程图 Y N Y N (AL)=(BL)? (AL)>(BL)? 第4章 汇编语言程序设计 PUSH DS SUB AX, AX
PUSH AX MOV AX, DAT MOV DS, AX 流程图 (AL)<= X (BL)<= Y 开 始 MOV AL, X MOV BL, Y CMP AL, BL JE C1 JA C2 (AL)=(BL)? Z <= 0 Y C2: MOV AL, 1 JMP EXT (AL)>(BL)? N Z <= 1 Y MOV AL, -1 Z <= -1 N 结束 C1: MOV AL, 0 JMP EXT EXT: MOV Z, AL RET

19 程 序 ;-- 数据段定义 ---------------------------------- DAT SEGMENT X DB 242
程 序 ;-- 数据段定义 DAT SEGMENT X DB 242 Y DB 67 Z DB ? DAT ENDS ;-- 代码段定义 COD SEGMENT ASSUME DS: DAT, CS: COD MAIN PROC FAR PUSH DS ; 保存返回地址 SUB AX, AX PUSH AX MOV AX, DAT MOV DS, AX ; 初始化DS

20 程 序(续) ; MOV AL, X MOV BL, Y CMP AL, BL JE C1 ; (AL)=(BL) 则跳转至C1,否则继续执行 JA C2 ; (AL)> (BL) 则跳转至C2,否则继续执行 MOV AL, -1 EXT: MOV Z, AL RET ; 返回DOS C1: MOV AL, 0 JMP EXT C2: MOV AL, 1 ; MAIN ENDP COD ENDS END MAIN

21 例2. 变量X的符号函数用下式表示。编程实现根据X的值给Y赋值。
例3. 数据块的传送。 考虑: ① 设数据在同一段内传送 将一块存储区既看作数据段,又看作附加段。 ②不重叠 CLD,直接用MOVS或MOV 源首址> 目标首址 ③ 重叠 CLD 增量传送 源首址<目标首址 STD 减量传送

22 程序如下: DATA SEGMENT STRG DB 1000 DUP(?) ;数据区起始 STG1 EQU STRG+7 ;定义源串存放区
STRSE EQU 50 DATA ENDS STACK SEGMENT PARA STACK ‘STACK’ DB 100 DUP(?) STACK ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA,ES:DATA MAIN: MOV AX,DATA MOV DS,AX ;DS指向数据段 MOV ES,AX ;ES指向数据段 MOV CX, STRSE ;串长→CX

23 MOV SI,OFFSET STG1 ;源串首地址→SI
MOV DI,OFFSET STG2 ;目标串首地址→DI CLD ;增量方式传送 PUSH SI ADD SI,STRSE-1 ;SI=源串末地址 CMP SI,DI ;DI=目标串首地址 POP SI JL OK ;源串地址与目标串地址不重叠,转OK处 STD ;否则,按减量方式传送 ADD SI,STRSE-1 ;指向数据块底部 ADD DI,STRSE-1 OK: REP MOVSB ;重复传送50个数据 MOV AX,4C00H INT 21H CODE ENDS END MAIN

24 二分支结构 例 要求对不足250个的学生成绩进行统计分析,统计出优秀、及格和不及格的人数。 (1)明确任务,确定算法。

25 (2)绘流程图 开始 SI←BUF首址 取总学生数CH←[SI] AH<60H? BX←0, SI←SI+1 取学生成绩AH←[SI]
结束 开始 SI←BUF首址 取总学生数CH←[SI] BX←0, SI←SI+1 取学生成绩AH←[SI] AH<90? AH<60H? BH←BH+1 BL←BL+1 SI←SI+1 CH←CH-1 SI←存储区首址 [SI]←BH [SI+1]←BL [SI+2]←CL CH=0? Y N CL←CL+1 图5-6 例5-3流程图

26 (3)根据流程图编写汇编语言程序 DATA SEGMENT BUF DB N DB N DUP(?) NUM DB 3 DUP(?)
DATA ENDS CODE SEGMENT MAIN PROC FAR ASSUME CS:CODE,DS:DATA START: PUSH DS SUB AX,AX PUSH AX MOV AX,DATA MOV DS,AX MOV SI,OFFSET BUF MOV CH,[SI] ;学生个数N→CH MOV CL, ;CL存不及格人数

27   MOV BX,0 ;BH存优秀人数,BL存及格人数
INC SI LP: MOV AH, [SI] ;取学生成绩 CMP AH,90 JB BLOW ;小于90转 INC BH ;优秀人数加1 JMP ABOV60 BLOW90: CMP AH,60 JB BLOW ;小于60转 ABOV60: INC BL ;及格人数加1 JMP NEXT BLOW60: INC CL ;不及格人数加1 NEXT: INC SI ;数组地址加1 DEC CH ;计数减1 JNZ LP MOV SI,OFFSET NUM MOV [SI],BH ;优秀人数送入内存单元 MOV [SI+1],BL ;及格人数送入内存单元

28 MOV [SI+2],CL ;不及格人数送入内存单元
RET MAIN ENDP CODE ENDS END START 多分支结构 1.条件逐次测试法 例5-4 编程实现使键盘上A、B、C、D六个字母键成为4条输     入命令,使之分别对应不同算法的控制子程序。 (1)明确任务,确定算法。 (2)绘流程图略

29 (3)汇编语言程序 MOV AH,l INT 21H ;1号功能调用,键盘接收 CMP AL,‘A’ ;键值为A,转PA子程序 JE PA
CMP AL,‘B’ ;键值为B,转PB子程序 JE PB CMP AL,‘C’ ;键值为C,转PC子程序 JE PC CMP AL,‘D’ ;键值为D,转PD子程序 JE PD HLT ;键值非A、B、C、D,停止 PA: … ;A号控制子程序入口 PB: … ;B号控制子程序入口 PC: … ;C号控制子程序入口 PD: … ;D号控制子程序入口

30 跳转表的组成 跳转指令(转向子程序的转移指令)
2. 利用跳转表实现分支 ——多用于多路分支 跳转地址(各子程序入口地址) 跳转表的组成 跳转指令(转向子程序的转移指令) (1)根据表内地址分支 ——将需要分支的各子程序入口地址按照一定的顺序存放在 内存区域中,在主程序中根据一定的算法计算出某子程 序地址在跳转表中的位置,从而得到相应子程序的入口 地址,然后用JMP指令转去执行。

31 Y N 结束 开始 AL←键盘输入字符 AL<41H? AL>44H? AL←AL-41H BX←取地址跳转表首址 AH←0 AL←计算表内地址 计算表地址BX←BX+AX 根据地址转向相应分支

32 (3)根据流程图编写汇编语言程序 ADATA SEGMENT BASE DW PA,PB,PC,PD KEY DB ? ADATA ENDS ASTACK SEGMENT PARA STACK ‘STACK’ DW DUP(?) TOP LABEL WORD ASTACK ENDS ACODE SEGMENT ASSUME CS:ACODE,DS:ADATA,SS:ASTACK START:MOV AX,ASTACK MOV SS,AX MOV SP, OFFSET TOP

33 MOV AX, ADATA MOV DS, AX LOP: MOV AH,1 INT H CMP AL,41H JB LOP CMP AL,44H JA LOP SUB AL,41H MOV BX,OFFSET BASE MOV AH,0 ADD AL,AL ADD BX,AX JMP WORD PTR[BX] ACODE ENDS END START

34 三、循环结构程序设计 1. 循环程序的组成 循环程序是在满足某些条件时对一段程序的重复执行,一般由四部分组成。 2. 基本结构形式 (1) 先执行后判断(do—while) 至少进入一次循环体。常用于循环次数已知时。 (2) 先判断后执行 循环体可一次都不执行。常用于循环次数未知,根据具体情况找出控制循环体结束的条件时常用。

35 统计字节数据块:-1,-3,5,6,9,…中负元素的个数。
(1) 先执行后判断(do—while) 例:P173 统计字节数据块:-1,-3,5,6,9,…中负元素的个数。 数据段定义如下: DATA SEGMENT BUF DB -1,-3,5,6,9,… ;定义若干字节带符号数 CUNT EQU $-BUF ;计算数据块长度 RESULT DW ? ;定义存放结果单元 DATA ENDS DATA SEGMENT BUF DB -1,-3,5,6,9,… ;定义若干字节带符号数 CUNT EQU $-BUF ;计算数据块长度 RESULT DW ? ;定义存放结果单元 DATA ENDS 对应的代码段程序: MOV BX,OFFSET BUF ;建立数据指针 MOV CX,CUNT ;设置循环次数 MOV DX,0 ;置结果初值 LP1: MOV AL,[BX] ;取数据 AND AL,AL JNS PLUS ;是正数,转去PLUS INC DX ;是负数,负数个数+1 PLUS: INC BX ;调整数据指针 LOOP LP1 ;(CX-1)≠0,继续循环 MOV RESULT,DX ;存入负数个数

36 循环体可一次都不执行。在循环次数未知,需根据具体情况找出控制循环体结束的条件时常用。
(2) 先判断后执行 循环体可一次都不执行。在循环次数未知,需根据具体情况找出控制循环体结束的条件时常用。 例:P173 例5-6 AX寄存器中有一个16位的二进制数,编程统 计其中1的个数,结果存放在CX寄存器中。 控制循环体的条件是:当AX内容为全0,不必再继续统计。 程序如下: MOV CX, ;置结果计数器初值 LP: AND AX,AX ;AX=0否 JZ EXIT ;是,退出循环 SAL AX,1 ;否,AX的最高位移至CF中 JNC ZERO ;CF=0,转ZERO继续循环 INC CX ;CF=1,结果计数器加1 ZERO: JMP LP EXIT: :

37 3. 循环控制方法 每个循环程序必须选择一个循环控制条件,来控制循环的运行和结束。常用循环控制条件(方法): (1)计数控制——循环次数已知,每循环一次加/减1。 (2)条件控制——循环次数未知,须根据条件控制循环。 (3)逻辑尺控制——多次循环过程中分别做不同的操作时, 可通过建立位串(逻辑尺)控制循环。

38 子程序不是一种基本的程序结构,但在程序设计时合理使用子程序是实现模块化程序设计的重要技巧。有两种子程序:
子程序设计和调用技术 子程序不是一种基本的程序结构,但在程序设计时合理使用子程序是实现模块化程序设计的重要技巧。有两种子程序: ① 重复使用的程序段或具有通用性便于共享的程序段(键盘处理、代码转换); ② 中断处理子程序:中断处理随机产生,对其处理只能采用子程序的形式。 二、子程序设计中的问题 1. 主程序与子程序的连接 主、子程序都存放在代码段: CALL:断点保护,转子程序。 RET: 断点恢复 。 若主、子程序在同一代码段,为段内调用; 若主、子程序各在不同的代码段,为段间调用。

39 “现场”,指转向子过程执行时主过程的状态,主要包括当时标志寄存器、段寄存器、通用寄存器及指令指针的内容。
2. 现场的保护与恢复 “现场”,指转向子过程执行时主过程的状态,主要包括当时标志寄存器、段寄存器、通用寄存器及指令指针的内容。 为保证主、子过程各自的数据信息和工作状态不会互相干扰,设计程序时应尽量使主、子过程有属于自己的工作空间。 用成对的PUSH、POP指令保护主程序与子程序中都要用到的Reg及mem。 方法二: PROC-1 PROC PUSH BX PUSH CX CALL PROC-1 POP CX POP BX RET PROC-1 ENDP 方法一: PUSH BX PUSH CX CALL PROC-1 POP CX POP BX 常用第二种方法保护和恢复现场。对中断子程序必须用第二种方法。

40 3. 主、子程序之间的参数传递 入、出口参数——传给子程序的参数及从子程序出来的参数。 参数传递通常有3种方法: (1)使用约定的寄存器传递
3. 主、子程序之间的参数传递 入、出口参数——传给子程序的参数及从子程序出来的参数。 参数传递通常有3种方法: (1)使用约定的寄存器传递 ——用寄存器实现参数传递。这也是最常用的方法,主要原因有寄存器是一种不用定义的全局寄存器变量、存取速度极快,但传递参数的个数有限。 (2)使用约定的存储单元传递 ——用内存变量实现参数传递。这种方法可以用于传递大量的参数,但其存取速度较慢。汇编语言中所定义的变量均为全局变量,无局部变量的概念。 (3)使用堆栈传递 ——这种方法容易引起错误,因为调用子程序时主程序的断点也在堆栈中,稍不留神就有可能使程序飞了。这种方法主要在多种语言混合编程时采用。

41 例1:求数组ARRAY中所有元素之和并存于SUM单元中。
三、子程序应用举例 (1) 使用约定的寄存器传递参数。 首先考虑如何编制一个子程序(确定算法); 在主、子程序中使用相同的寄存器。 例1:求数组ARRAY中所有元素之和并存于SUM单元中。 ;子程序名:SUM1。程序功能:求字节数组和。 ;入口参数:SI=数组首址,CX=数组长度 ;出口参数:AX=数组和。使用寄存器:AX,CX,SI。

42 STACK SEGMENT PARA STACK ‘STACK’
DB 100 DUP (?) STACK ENDS DATA SEGMENT ARRAY DB d1,d2,d3,…,dn ;若是字数组, COUNT EQU $-ARRAY ;个数= ($-ARRAY)/ 2 SUM DW ? DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX LEA SI,ARRAY MOV CX,COUNT CALL SUM ;调用子程序求和,返回值在AX中 MOV SUM,AX ;和存于SUM单元 MOV AH,4CH ;返回DOS INT H ;入口参数准备,将需要传递的 参数送入寄存器

43 SUM1 PROC NEAR CMP CX,0 JZ EXIT MOV AX,0 ;数组和通过AX寄存器回送到主程序 AGAIN: ADD AL,[SI] ADC AH,0 INC SI LOOP AGAIN EXIT: RET SUM1 ENDP CODE ENDS END START 请注意子程序与主程序都放在同一个代码段!

44 程序应用举例 例1:在某串中查找某个特定字符,找到显示‘Y’,未找到显示‘N’。
分析:在串中查找可用两种方法实现:串查找和循环比较。串查找方法的核心指令为REPNE SCASB,使用这条指令之前必须预置ES、DI、AL、DF、CX的初值。ES:DI指向待查字符串,CX为串长,AL存放待查字符,DF决定串指针DI的变化方向(一般为0即向加的方向变化)。循环比较方法的核心指令为比较指令及LOOPNE 标号,这里特别要注意LOOPNE所判断的ZF应为比较指令所影响的ZF。而非参数改变影响的ZF。

45 ------------------------------------------------------------------
DATA SEGMENT STRING DB ‘How are you!, welcome to china!’ N EQU $-STRING DATA ENDS CODE  SEGMENT ASSUME  CS:CODE,ES:DATA START:  MOV  AX,DATA  ;置ES段初值 MOV  ES,AX LEA DI,STRING MOV CX,N CLD MOV AH,1 INT 21H ;从键盘输入待查字符

46 REPNE SCASB JZ FOUND ;转到找到分支 MOV DL,‘N’ ;未找到处理 JMP DISP ;转到后续公共位置处
FOUND: MOV DL,‘Y’ DISP: MOV AH,2 INT 21H    MOV  AH,4CH  ;返回DOS      INT  21H CODE ENDS END  START

47 DATA SEGMENT STRING DB ‘How are you!, welcome to china!’ N EQU $-STRING DATA ENDS CODE  SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA  ;置ES段初值 MOV DS,AX LEA DI,STRING-1 ;置串指针初值,因为循环中参数改变需要置于比较指令之前,所以应先减1 MOV CX,N MOV AH,1 INT 21H

48 AGAIN: INC DI ;参数改变 CMP AL,[DI] ;比较查找 LOOPNE AGAIN ;未找到且没找完继续查找 JZ FOUND ;转到找到分支 MOV DL,‘N’ ;未找到处理 JMP DISP ;转到后续公共位置处 FOUND: MOV DL,‘Y’ DISP: MOV AH,2 INT 21H    MOV AH,4CH  ;返回DOS      INT  21H CODE ENDS END START

49 例2:求1至10的累加和送AL。 分析:循环操作为累加,和初值为0,参数初值为1,累加到10为止,即循环次数为10次,本例采用直到循环编程,下例采用当循环编程。 CODE  SEGMENT ASSUME CS:CODE START: MOV  CX,10 MOV  BL,1 XOR  AL,AL AGAIN:  ADD  AL,BL INC  BL LOOP AGAIN    MOV  AH,4CH INT  21H CODE  ENDS END  START

50 例3:对例2用当循环法编程 CODE SEGMENT ASSUME CS:CODE START: MOV BL,1 XOR AL,AL
AGAIN: CMP BL, : CMP BL,11 JA DONE ; JZ DONE ADD AL,BL INC  BL JMP  AGAIN DONE: MOV AH,4CH INT  21H CODE  ENDS END START


Download ppt "汇编语言程序设计基础 汇编源程序的基本结构形式 ——介绍汇编语言程序设计的常用结构与方法 模块和段"

Similar presentations


Ads by Google