汇编语言程序设计课件 第5讲 变量定义和存储器寻址

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

变量定义的实质探索
变量名 的实质是 存储区的开始地址 变量类型 的实质是 每个数据所占的存储单元数
实例1:【简单变量】计算x=a+b-c
内存中保存了a、b和c的值, 计算x 数据定义
a b c x db db db db 3 10 5 ?
程序错误
查看ADD指令P435,注意操作 数有没有 mem,mem ?
修改程序
mov al,a add al,b sub al,c mov x,al int 20h a db 3 b db 10 c db 5 x db ?
程序
mov add add sub int x,0 x,a x,b x,c 20h
注意
变量定义的位置,目前我们放 在不影响程序运行的地方:最后 最后
Inbuff Sum db Min db Max db db 0,0,0,0,0,0,0,0,0,0 ? ? ?
“大型”程序的设计方法
可以分别设计和调试三个部分
数据输入部分
接收10个一位数保存在inbuff数组中
数据处理部分
统计总分sum和最大值max和最小值min sum max min 计算sum-max-min sum
Buff db 3,6,2,7,11,15,4,12,4,1 Max db ?
程序的另一种写法
Mov bx,0 Mov al,[bx+buff] Again: cmp al,[bx+buff] jae next mov al,[bx+buff] next: inc bx cmp bx,10 jne again mov max,al int 20h Buff db 3,6,2,7,11,15,4,12,4,1 Max db ?
将al保存到max中
流程图
开始 初始化: 计数器=9,取数地址=buff Al [取数地址],取数地址 取数地址+1
寄存器分配
已经使用了
AL
AL >= [取数地址]? Al [取数地址]
计数器 CX 取数地址 BX
取数地址 取数地址+1 计数器 计数器 - 1 计数器=0? Max 结束 AL
程序
color black blue green cyan red magenta brown light gray dark gray light blue light green light cyan light red light magenta yellow white
实例2:使用BX寄存器间接寻址
mov bx,0 mov ah,0 mov ch,0 mov cl,10 procs: mov al,inbuff[bx] add ah,al cmp al,cl jae L1 mov cl,al L1: cmp al,ch jbe L2 mov ch,al L2: inc bx cmp bx,10 jnz procs mov max,ch mov min,cl sub ah,ch sub ah,cl mov sum,ah int 20h
将buff偏移地址复制到bx
Baidu Nhomakorabea
修改程序
Mov cx,9 Mov bx,offset ptr buff Mov al,[bx] Inc bx Again: cmp al,[bx] jae next mov al,[bx] next: inc bx dec cx cmp cx,0 jne again mov max,al int 20h ;或 lea bx , buff 或
程序的一维数组形式的写法
Mov bx,0 Mov al,buff[bx] Again: cmp al,buff[bx] jae next mov al,buff[bx] next: inc bx cmp bx,10 jne again mov max,al int 20h Buff db 3,6,2,7,11,15,4,12,4, 2 Max db ?
实例3:显示26个大写字母
mov ax, 0b800h mov ds, ax mov al,'A' mov bx,00H Again: mov [BX], al inc al inc bx inc bx cmp al,'Z' jbe again int 20h
实例4:显示26个大写字母(带色彩)
注意:
这些命令是DEBUG的命令 不是程序操作数据
存储器编程1
将34H存放在1000H单元,12H存放在1001H单元。 程序(用DEBUG验证)
Mov [1000],34 Mov [1001],12
错误!
原因: 34没有类型!也可能是0034H
修改
Mov byte ptr [1000],34 Mov byte ptr [1001],12
说明
显示存储器 B800:0000地址开始的内存对应屏幕上 每个位置要显示的字符 每2个字节对应一个位置 1:要显示内容的ASCII码 2:显示方式 [前景][背景]
修改颜色
hex 0 1 2 3 4 5 6 7 8 9 a b c d e f
bin 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111
第五讲 变量定义和存储器寻址
1. 2. 3. 4. 5. 数据在存储器中的存放和存取 变量的定义和使用 存储器寻址 “大型”程序设计方法 作业
1、数据在存储器中的存放和存取
使用DEBUG观察
D命令 格式 显示内存内容 D [range]
显示2000~2030的内容 显示2000开始长度33的内容 D 开始地址,结束地址/长度 例 D 2000 2030 D 2000 L33
数据输出部分
输出 sum (显然 sum 最大72 ,两位数输出)
数据输入
1
接收10个一位数保存在inbuff数组中 mov bx,0 Input: mov ah,1 int 21h sub al,30h mov inbuff[bx],al inc bx cmp bx,10 jnz input int 20h
实例2:【一维数组】找最大数
内存变量buff中存放了十个单字节无符号数, 将最大值找出并存放在变量max中。 数据定义
Buff db 3,6,2,7,11,15,4,12,4,1 Max db ?
思路
先将第一个数取到al中 从第二个数开始,重复下列操作9次
比较al和该数,如果al较小,将该数据取入al
对比
Mov word ptr [1000],1234 Mov word ptr [1001],5678
分析
实例1:Hello! (使用直接写屏方式)
显示Hello!
mov mov mov mov mov mov mov mov int mov mov mov mov mov mov mov mov mov mov mov int ax, 0b800h ds, ax [02h], 'H' [04h], 'e' [06h], 'l' [08h], 'l' [0ah], 'o' [0ch],'!' 20h ax, 0b800h ds, ax [02h], 'H' [04h], 'e' [06h], 'l' [08h], 'l' [0ah], 'o' [0ch],'!' [03h],11101100b [05h],11100100b [07h],4fh 20h
E命令 格式

修改内存内容 E address,[list]
E 1000 E 1000 1 2 3 4 从1000 开始输入存入的内容 从1000开始依次存入1 2 3 4
F命令 格式

内存填充命令 F range list
F 2000 L15 1 2 F 2000 2100 3 4 依次将1,2存入2000~2014 依次将3,4存入2000~2100
开始 初始化: 计数器=9,取数地址=buff Al [取数地址],取数地址 取数地址+1
AL >= [取数地址]? Al [取数地址]
取数地址 取数地址+1 计数器 计数器 - 1 计数器=0? Max 结束 AL
Mov cx,9 Mov bx,buff Mov al,[bx] Inc bx Again: cmp al,[bx] jae next mov al,[bx] next: inc bx dec cx cmp cx,0 jne again mov max,al int 20h
说明
错误原因
Mov bx,buff 的含义是将buff地址的内容复制 到bx中。
由于buff类型是字节( DB ),而bx为字寄存器
本例中需要的是buff的地址值(而不是其中 的内容)
指令 mov bx, offset ptr buff
将 buff地址复制到bx C语言 bx=&buff
指令 lea bx , buff
2 读数下标 bx 0 总分 ah 0 最大值 ch 0 最小值 cl 10 读取一个数 ah ah+al AL
al >= cl ? cl al
al <=ch ? ch al
数组下标+1 数组下标!=10?
计算sum-max-min sum
3
数据输出
输出整数 sum Mov ah,2 Mov dl,10 Int 21h Mov ah,2 Mov dl,13 Int 21h mov ah,0 Mov al,sum Mov bl,10 Div bl Mov bx,ax Cmp bl,0 Jz skip Mov dl,bl Add dl,30h Mov ah,2 Int 21h Skip: mov dl,bh add dl,30h mov ah,2 int 21h int 20h
3 输出回车换行 求sum 的 十位数 BL 个位数 BH BL= 0 ? 输出BL对应数码 输出 对应数码
输出BH对应数码 输出 对应数码 4
完整程序
Mov bx,0 Input: mov ah,1 int 21h sub al,30h mov inbuff[bx],al inc bx cmp bx,10 jnz input mov bx,0 mov ah,0 mov ch,0 mov cl,10 procs: mov al,inbuff[bx] add ah,al cmp al,cl jae L1 mov cl,al L1: cmp al,ch jbe L2 mov ch,al L2: inc bx cmp bx,10 jnz procs mov max,ch mov min,cl sub ah,ch sub ah,cl mov sum,ah Mov ah,2 Mov dl,10 Int 21h Mov ah,2 Mov dl,13 Int 21h mov ah,0 Mov al,sum Mov bl,10 Div bl Mov bx,ax Cmp bl,0 Jz skip Mov dl,bl Add dl,30h Mov ah,2 Int 21h Skip: mov dl,bh add dl,30h mov ah,2 int 21h int 20h Inbuff Sum db Min db Max db db 0,0,0,0,0,0,0,0,0,0 ? ? ?
直接寻址 寄存器间接寻址 寄存器相对寻址
使用寄存器BX
Mov [BX] ,’A’
使用寄存器+常数
Mov [BX+1] ,’A’
2、变量的定义和使用
如何定义变量
格式 [变量名] [数据类型][数据列表] [;注释] 【变量名】 【数据类型】 DB DW DD DF DQ DT 【数据列表】 例 A db 1,2,3,4,5 B dw 1,2,3,4,5 C dd 1,2,3,4,5
综合实例1:统计
接收从键盘输入的10个人的成绩(成绩为 0~9),计算去掉一个最高分和一个最低分后 的总成绩输出。 思路
首先接收10个一位数保存在inbuff数组中 然后统计总分sum和最大值max和最小值min 然后统计总分 和最大值 和最小值 最后计算sum=sum-max-min并输出
数据定义
mov ax, 0b800h mov ds, ax mov al,'A' mov bx,00H Again: mov [BX], al mov [bx+1],0ECH inc al inc bx inc bx cmp al,'Z' jbe again int 20h
存储单元表示小结
直接给出地址
Mov [02h] ,’H’
修改程序
mov [bx],0ECH 将0ECH存放在内存中,其地 址由bx决定。
mov ax, 0b800h mov ds, ax mov [02h], 'H' mov [04h], 'e' mov [06h], 'l' mov [08h], 'l' mov [0ah], 'o' mov [0ch],'!' mov bx,03h again: mov [bx],0ECH inc bx inc bx cmp bx,0eh jc again int 20h
Inbuff Sum db Min db Max db db 0,0,0,0,0,0,0,0,0,0 ? ? ?
初始化存数下标bx 键盘输入一个一位数 保存到数组inbuff[bx]中 数组下标+1 数组下标!=10?
2
数据处理
统计总分sum和最大值max和最小值min 计算sum-max-min sum
相关文档
最新文档