- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
说明
显示存储器 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
将buff偏移地址复制到bx
修改程序
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 或
实例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个大写字母(带色彩)
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
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
实例2:【一维数组】找最大数
内存变量buff中存放了十个单字节无符号数, 将最大值找出并存放在变量max中。 数据定义
Buff db 3,6,2,7,11,15,4,12,4,1 Max db ?
思路
先将第一个数取到al中 从第二个数开始,重复下列操作9次
比较al和该数,如果al较小,将该数据取入al
修改程序
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
注意
变量定义的位置,目前我们放 在不影响程序运行的地方:最后 最后
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
第五讲 变量定义和存储器寻址
1. 2. 3. 4. 5. 数据在存储器中的存放和存取 变量的定义和使用 存储器寻址 “大型”程序设计方法 作业
1、数据在存储器中的存放和存取
使用DEBUG观察
D命令 格式 显示内存内容 D [range]
显示2000~2030的内容 显示2000开始长度33的内容 D 开始地址,结束地址/长度 例 D 2000 2030 D 2000 L33
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’
开始 初始化: 计数器=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
数据输出部分
输出 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
对比
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
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 ?
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 ? ? ?
综合实例1:统计
接收从键盘输入的10个人的成绩(成绩为 0~9),计算去掉一个最高分和一个最低分后 的总成绩输出。 思路
首先接收10个一位数保存在inbuff数组中 然后统计总分sum和最大值max和最小值min 然后统计总分 和最大值 和最小值 最后计算sum=sum-max-min并输出
数据定义
直接寻址 寄存器间接寻址 寄存器相用寄存器+常数
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
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