汇编语言程序设计 实例详解共38页
汇编语言程序设计ppt课件

3.用注释行说明程序,便于阅读和修改调试和修改。
1
9
常用程序结构: 顺序程序、循环程序、分支程序、查表程序、子程
2. 顺序与循环程序设计
❖5.2.1 顺序程序设计(又称简单程序) 既无分支,又无循环,按照顺序执行 可完成一定的基本功能,是编写复杂程序的 基础
10
例1:将一个字节内的两个BCD码拆开并变成ASCII码, 存入两个RAM单元。BCD码放在内RAM的20H, 转换后高半字节放到21H,低字节放22H。
ROM
20H BCDH BCDL
SWAP A ORL A, #30H MOV 21H, A SJMP $
;BCDH数送A的低4位 21H 0011 BCDH ;完成转换 @R0 22H 000101 B0C0D0L0
;存数
END
12
回目录 上页 下页
5.2.2 循环程序
包含多次重复执行的程序段,循环结构使程序紧凑。
11
回目录 上页 下页
程序:
ORG 1000H
MOV R0, #22H ;R0 22H MOV @R0,#0 ; 22H 0 MOV A, 20H ;两个BCD数送A
A
B0C0D01H01 B0BCC0DD0LH0
XCHD A, @R0 ;BCDL数送22H ORL 22H, #30H ;完成转换
表示程序结构和程序功能
美国国家标准化协会ANSI(American National
Standard Institute)设定了一些常用的流程图符号如图所示:
开始
起止框
或
流程线
输入输出框 判断框
处理框
连接点 图:常用流程图符号
Y
?
汇编语言编程实例

汇编语言编程实例一、引言汇编语言是计算机硬件和软件之间的桥梁,它是一种低级语言,可以直接控制计算机硬件。
汇编语言编程可以让程序员更加深入地理解计算机的工作原理,从而实现更高效的程序。
本文将介绍几个汇编语言编程实例,涉及到基本的输入输出、循环、条件判断、数组等知识点。
在这些实例中,我们将使用NASM汇编器进行编译和链接。
二、基本输入输出1. 输出字符串在汇编语言中,我们可以使用系统调用来进行输入输出操作。
在Linux 系统中,输出字符串的系统调用为write。
下面是一个输出字符串的示例程序:```section .datamsg db 'Hello, World!',0xa ;定义一个字符串len equ $-msg ;获取字符串长度section .textglobal _start_start:mov eax, 4 ;write系统调用号为4mov ebx, 1 ;文件描述符为1(标准输出)mov ecx, msg ;要输出的字符串地址mov edx, len ;要输出的字符数int 0x80 ;调用系统调用mov eax, 1 ;exit系统调用号为1xor ebx, ebx ;退出状态码为0int 0x80 ;调用系统调用退出程序```2. 输入数字类似地,在Linux系统中,输入数字的系统调用为read。
下面是一个输入数字的示例程序:```section .datamsg db 'Please enter a number: ',0xa ;提示信息len equ $-msg ;获取字符串长度buf resb 1 ;定义一个字节的缓冲区section .textglobal _start_start:mov eax, 4 ;write系统调用号为4mov ebx, 1 ;文件描述符为1(标准输出)mov ecx, msg ;要输出的字符串地址mov edx, len ;要输出的字符数int 0x80 ;调用系统调用mov eax, 3 ;read系统调用号为3mov ebx, 0 ;文件描述符为0(标准输入)mov ecx, buf ;缓冲区地址mov edx, 1 ;要读取的字节数int 0x80 ;调用系统调用sub al, '0' ;将ASCII码转换成数字值```三、循环和条件判断1. 计算1到100的和下面是一个计算1到100的和的示例程序,其中使用了循环和条件判断:```section .datasum dd 0 ;定义一个双精度浮点型变量sumsection .textglobal _start_start:xor eax, eax ;eax清零,作为计数器和累加器使用loop_start:inc eax ;eax自增1,相当于i++cmp eax, 100+1 ;比较i是否大于100,注意要加1je loop_end ;如果i等于101,跳转到loop_endadd dword [sum], eax ;将i加到sum中jmp loop_start ;跳转到loop_startloop_end:mov eax, dword [sum] ;将sum赋值给eax,作为返回值mov ebx, 1 ;exit系统调用号为1int 0x80 ;调用系统调用退出程序```2. 判断一个数是否为素数下面是一个判断一个数是否为素数的示例程序,其中使用了循环和条件判断:```section .datamsg db 'Please enter a number: ',0xa ;提示信息len equ $-msg ;获取字符串长度buf resb 1 ;定义一个字节的缓冲区section .textglobal _start_start:mov eax, 4 ;write系统调用号为4mov ebx, 1 ;文件描述符为1(标准输出)mov ecx, msg ;要输出的字符串地址mov edx, len ;要输出的字符数int 0x80 ;调用系统调用mov eax, 3 ;read系统调用号为3mov ebx, 0 ;文件描述符为0(标准输入)mov ecx, buf ;缓冲区地址mov edx, 1 ;要读取的字节数int 0x80 ;调用系统调用sub al, '0' ;将ASCII码转换成数字值check_prime:xor ebx, ebx ;ebx清零,作为除数使用mov ecx, eax ;将eax的值赋给ecx,作为被除数使用inc ebx ;将ebx自增1,相当于除数加1cmp ebx, ecx ;比较除数是否大于被除数jge is_prime ;如果除数大于等于被除数,跳转到is_prime xor edx, edx ;edx清零,作为余数使用div ebx ;将ecx/ebx的商放在eax中,余数放在edx中 cmp edx, 0 ;判断余数是否为0je not_prime ;如果余数为0,跳转到not_primejmp check_prime ;跳转到check_primenot_prime:mov eax, 4 ;write系统调用号为4mov ebx, 1 ;文件描述符为1(标准输出)mov ecx, not_prime_msg ;要输出的字符串地址mov edx, not_prime_len ;要输出的字符数int 0x80 ;调用系统调用exit:mov eax, 1 ;exit系统调用号为1xor ebx, ebx ;退出状态码为0int 0x80 ;调用系统调用退出程序not_prime_msg db 'The number is not prime.',0xa ;提示信息not_prime_len equ $-not_prime_msgis_prime:mov eax, 4 ;write系统调用号为4mov ebx, 1 ;文件描述符为1(标准输出)mov ecx, is_prime_msg ;要输出的字符串地址mov edx, is_prime_len ;要输出的字符数int 0x80 ;调用系统调用jmp exit ;跳转到exitis_prime_msg db 'The number is prime.',0xa ;提示信息is_prime_len equ $-is_prime_msg```四、数组1. 计算数组的和下面是一个计算数组的和的示例程序:```section .dataarr dd 1, 2, 3, 4, 5 ;定义一个双精度浮点型数组arrn equ ($-arr)/4 ;获取数组长度section .textglobal _start_start:xor eax, eax ;eax清零,作为计数器和累加器使用xor ecx, ecx ;ecx清零,作为数组下标使用loop_start:cmp ecx, n ;比较ecx是否大于等于njge loop_end ;如果ecx大于等于n,跳转到loop_endadd eax, dword [arr+ecx*4] ;将arr[ecx]加到eax中inc ecx ;将ecx自增1,相当于下标加1jmp loop_start ;跳转到loop_startloop_end:mov ebx, eax ;将sum赋值给ebx,作为返回值mov eax, 1 ;exit系统调用号为1xor ecx, ecx ;退出状态码为0int 0x80 ;调用系统调用退出程序```2. 查找数组中的最大值下面是一个查找数组中的最大值的示例程序:```section .dataarr dd 10,20,30,-40,-50,-60,-70,-80,-90,-100 ;定义一个双精度浮点型数组arrn equ ($-arr)/4 ;获取数组长度section .textglobal _start_start:mov eax, dword [arr] ;将arr[0]赋值给eax,作为最大值使用xor ecx, ecx ;ecx清零,作为数组下标使用loop_start:cmp ecx, n ;比较ecx是否大于等于njge loop_end ;如果ecx大于等于n,跳转到loop_endcmp eax, dword [arr+ecx*4] ;比较eax和arr[ecx]jge loop_next ;如果eax大于等于arr[ecx],跳转到loop_next mov eax, dword [arr+ecx*4] ;将arr[ecx]赋值给eax,更新最大值loop_next:inc ecx ;将ecx自增1,相当于下标加1jmp loop_start ;跳转到loop_startloop_end:mov ebx, eax ;将max赋值给ebx,作为返回值mov eax, 1 ;exit系统调用号为1xor ecx, ecx ;退出状态码为0int 0x80 ;调用系统调用退出程序```五、总结本文介绍了几个汇编语言编程实例,涉及到基本的输入输出、循环、条件判断、数组等知识点。
汇编语言程序设计

…… 跳转到出口处end
……
casen:
跳转到出口处end ……
(执行条件n成立的语句)
end 分支结束出口
图9.13 汇编语言多重分支方第式14页
2021/12/8
下面我们用相应的例子来详细的说明这两种分支结构。
例 阶跃函数
说明:这是一个典型的双分支结构,输入值大于等于0时则返回1,输入值小于0时返 回0。r1>=0?r1=0r1=1退出图9.14 阶跃函数流程图NY
//与0比较 //大于等于0则跳转到非负数处理 //小于0则返回0 //跳转到程序结束处
//大于0,则返回1
第16页
2021/12/8
3、循环程序设计
(1) 循环程序的结构形式
循环程序可以有两种结构形式,一种是WHILE_DO结构 形式;另一种是DO_UNTIL结构形式。如图9.16所示.
初始化
初始化
入口参数:R1;(有符号数) 出口参数:R1
流程图如图9.14所示。
N
Y
R1>=0 ?
r1=0
r1=1
退出
图9.14 阶跃函数流程图
第15页
2021/12/8
程序的代码如下: .PUBLIC F_Step; .CODE F_Step: .proc CMP R1,0; JGE ?negtive; R1 = 0; JMP ?Step_end; ?negtive: R1 = 1; ?Step_end: RETF; .ENDP
1.4 嵌套与递归
1、 子程序的嵌套
子程序嵌套就是指子程序调用子程序。其中嵌套的层数称为嵌套深度。图9.27表
示了三重嵌套的过程。
SUB1
主 程 序
汇编语言程序设计 实例详解

_c_int00: start:
Done:
.text B NOP NOP SSBX STM STM RPT MVPD STM STM STM RPTZ MAC STH B .end
start
FRCT #0,SWWSR #x,AR1 #7 table,*AR1+ #x,AR2 #a,AR3 #y,AR4 A,#3 *AR2+,*AR3+,A A,*AR4 done
DARAM2: origin = 0200h,length = 100h
}
SECTIONS
{
.data :> RAM
PAGE 0
.text :> RAM
PAGE 0
PROM :> RAM1 PAGE 0
.bss :> DARAM1 PAGE 1
DATA :> DARAM2 PAGE 1
}
[例7-4]使用C54汇编语言编程计算z1=x1+y1、z2=x1-y1,z3=x1* Z4=x2*y2,观察计算结果。其中,x1=20,y1=54,x2=0.5,y2=-0.5
.bss a,20
.bss x,20
DATA
.bss y,20 .usect “DATA”,20
.text
_c_int00: B start
NOP
NOP
start: STM #a,AR1
;a[20]={0,1,2,3,4,5,6,7,8,9,10,
;11,12,13,14,15,16,17,18,19}
.text
_c_int00: B
start
NOP
start:
LD
#x1,DP
第4章汇编语言程序设计3(常见程序设计举例)精品PPT课件

;实际字符数送CL ;第一个字符送AL ;暂存在CH
;第一个字符是负
;不是,转NEXT1 ;字符数减1
;指向第一个数字字符 ;清零AX,存二进制数
;若(CL)=0,转NEXT2 ;取字符 ;转换成BCD码 ;加到中间结果上
10
NEXT2:
NEXT3: CHANGE ; CODE
MOV MUL INC JMP MOV AND ADD CMP JNZ NEG MOV RET ENDP
ENDS END
DX,10 DX BX SHORT LP1 DL,[BX] DL,0FH AX,DX CH,’-’ NEXT3 AX [DI],AX
START
;*10 ;指向下一个字符
;取个位数 ;个位ASCII→未组合BCD ;加个位数,(AX)=001AH
;是’-’? ;该数非负,转NEXT3 ;若为负,求补 ;存二进制结果
16
AGAIN1: NEXT1: AGAIN2: NEXT2:
;计算百位的个数 MOV DL,0 SUB AX,1000 JC NEXT1 INC DL JMP AGAIN1 ADD AX,1000 MOV [BX],DL ;计算百位的个数 MOV DL,0 SUB AX,100 JC NEXT2 INC DL JMP AGAIN2 ADD AX,100 MOV [BX+1],DL
;(SP)=0052H ;(AX)=25AFH ;(DI)=0002H STRING-4;(DI)=0005H ;(DX)=25AFH
BCD→二进制数在本例中采用用以下方法:
((((0+千位数)*10+百位数)*10)+十位数)*10+个位数
第一次中间结果
汇编语言程序设计实例分析

MOV AL,TAB MOV BX,OFFSET TAB MOV CL,9 LL: INC BX CMP AL,[BX] JAE TT XCHG AL,[BX] TT: DEC CL JNZ LL MOV MAX,AL MOV AH,4CH INT 21H CODE ENDS END START
例3:设计一个程序,统计内存W单元保 存的无符号字数据中有多少个二进制 “1”,结果送内存N单元保存
分析:要统计内存W单元保存的无符号字数 据中有多少个二进制“1”,可将该数据送至 寄存器AX中,通过移位指令将AX中的每一 位依次移入进位位CF中,若CF=1则计数器 CL的值加1。 这样就可以统计出址加1 ;两数比较 ;大于等于转 ;交换数据位置 ;计数器减1 ;非0转 ;保存最大数
例7:从键盘输入3-9之间的数字,用 “*”号组成三角形图案
例如:输入数字7,屏幕上显示出以下图案: ******* ****** ***** **** *** ** * 可采用双重循环程序,外循环控制行数,内循环 控制列数。
CODE SEGMENT ASSUME CS:CODE START:MOV AH,01H INT 21H CMP AL,33H JB START CMP AL,39H JA START SUB AL,30H MOV CL,AL MOV CH,0 MOV DL,0DH MOV AH,02H INT 21H MOV DL,0AH INT 21H
思考:在本例的基础上,若要在屏幕上 显示出以下图案,应该如何设计程序?
* ** *** **** ***** ****** ******* ********* 或者: * * *
*
* * ************
汇编语言程序举例ppt课件

即两个带符号数相乘,得到的乘积带有2个符号位 ,造成错误的结果。
同样,对于两个十六位数相乘,乘积只有30位, 在最高的两位也是符号位,同样会造成错误的结果.
解决冗余符号的办法是:在程序中设定状态寄存器 ST1中的FRCT(小数方式)位1,在乘法器将结果传送 至累加器时就能自动地左移1位,累加器中的结果为: S zzzzzz0 ( Q7 格 式 ) , 即 11101000 ( -0.1875=24/27←-24=(11101000)补),自动地消去了两个带 符号数相乘时产生的冗余符号位。所以在小数乘法编 程时,应当事先设置FRCT位:
汇编语言编程举例
第一节 汇编语言编程的基本方法 第二节 DSP的浮点运算方法 第三节 DSP在信号发生器上的应用 第四节 用DSP实现FIR滤波器 第五节 用DSP实现IIR滤波器
第一节 汇编语言编程的基本方法
1.堆栈的使用
1.压入数据时,堆栈从高地址向低地址 增长。 2.压栈时指针先减,SP-1,再压入数据; 3.出栈时,先弹出数据后,再SP+1。 4.如要用堆栈,必须先设置,后使用。
(2)数据存储器→数据存储器
例: 将数据存储器中的数组x[10]复制到数组y[10]。
.title “cjy1.asm” ;为汇编源程序取名
.mmregs
;定义存储器映象寄存器
STACK .usect “STACK”,30H;设置堆栈
.bss x,10 ;为数组x分配10个存储单元
.bss y,10 ;为数组y分配10个存储单元
为:
MSB(最高位)
…
LSB(最低位)
第4章汇编语言程序设计ppt课件

DATA1
11
22
33 44
DATA2
11
00
22
00
44
33
DATA3
22
0
0
0
22
0
0
0
XX
66
55 44 33
28
数据定义伪指令的几点 说明
伪指令的性质决定所定义变量的类型;
定义字符串必须用DB伪指令
例:
DATA1 DB ‘ABCD’,66H
41H
‘A’
42H
‘B’
43H
‘C’
44H
‘D’
AH
DISN:T D2X1H
功能号OAH 字符串在内存中的存放地址
58
2. 定义字符缓冲区
用户自定义缓冲区格式:
N1 N2
存放字符个数:≤255
存放键入的字符 整个缓冲区
实际键入字符数 最大可键入字符数
0DH
59
输入字符串程序段
DAT1 DB 20,?,20 DUP(?)
┇
LEA DX,DAT1 MOV AH,0AH INT 21H
定义的变量为4字型(8字节)
定义的变量为10字节型
26
数据定义伪指令例
DATA1 DB 11H,22H,33H,44H DATA2 DW 11H,22H,3344H DATA3 DD 11H*2,22H,33445566H
以上变量在内存中的 存放形式
27
数据定义伪指令例_变量在内存中的
分布
DSEG SEGMENT DATA1 DB 1,2, 3 DUP(?) DATA2 DW 1234H
DSEG ENDS ESEG SEGMENT