第四章 汇编语言程序设计基础
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
例4.2 统计某字单元中二进制数位值为1的个数,统计结果存放在变量
;………… data segment number dw 1699H one db 0 data ends ; ………… Code segment assume cs:code,ds:data start: mov ax,data mov ds,ax mov ax,number compa:cmp ax.o jz finish shl ax,1 jnc compa inc one jmp compa finish: mov ax,4c00h int 21h code ends ; ………… end start
begin: push cx ;外循环次数进栈 mov cl,4 ;设置移位次数 mov di,4 ; 设置内循环次数 mov dl, ‘ ‘ ;显示空格 mov ah,02 int 21h mov dx,0 ;十六进制数在dx中,初始值为0 input: mov ah,01;设置键盘中断,键入的值在al中 int 21h and al,0fh ;屏蔽高4位 shl dx,cl ;将十六进制数左移4位 or dl,al;用或拼成新的数 dec di ;内循环次数减1 jne input ;内循环未结束,继续输入 mov [si],dx ;内循环结束,保存十六进制数 add si,2;si指向保存下一个十六进制数的单元 pop cx ;外循环次数出栈 loop begin ;外循环未结束,继续输入下一个十六进制数
begin: mov cx, string2-string1 ;串1长度→CX mov bx, mess1-string2 ;串2长度→BX cmp bx,cx ;比较两串长 jnz dispno ;串长不等,显示‘NO MATCH’ lea si,string1 ;SI指向串1首址 lea di,string2 ;DI指向串2首址 repe cmpsb ;比较两串 jne dispno ;两串不等,显示‘NO MATCH’ mov ah,9 ;两串相等,显示‘MATCH’ lea dx,mess1 int 21h ret dispno: mov ah, 9 lea dx, mess2 int 21h ret main endp prognam ends end start
4.2.2 分支程序的设计方法 ★条件控制 ★逻辑尺控制 ★地址跳转表控制
1. 条件控制——利用比较和条件转移指令实现分支,是最常用的 程序设计方法。
Hale Waihona Puke Baidu
例如,求解函数:
练习题2. 编写程序,比较两个字符串STRING1和STRING2所 含字符是否完全相同,若相同则显示“MATCH”,若不同则显示 “NO MATCH”。 答案: datarea segment string1 db ‘asfioa’ ;定义字符串STRING1 string2 db ‘xcviyoaf’ ;定义字符串STRING2 mess1 db ‘MATCH’,’$’ ;定义显示字串“MATCH” mess2 db ‘NO MATCH’,’$’ ;定义显示字串“NO MATCH” datarea ends prognam segment main proc far assume cs:prognam,ds:datarea start: push ds ;将ds:00入栈 sub ax,ax push ax mov ax,datarea ;装填数据段及附加段 mov ds,ax mov es,ax
next1: cmp [si+4],ax ;第1个数与第3个数比较 jne next2 ;第1、3个数不等,则转比较第2、3个数 add dl,2 ;第1、3个数相同,dl加2 next2: cmp [si+4],bx ;第2、3个数比较 jne num ;第1、2、3个数均不相等 add dl,2 ;第2、3个数均相同 , 则dl加2 num: cmp dx,3 ;dl小于3则值不变且转显示 jl disp mov dl,3 ;dl大于3则修改为3 disp: mov ah,2 ;调用DOS2号功能(显示单个字符) add dl,30h ;将dl的内容修改为ASCII码 int 21h ret ;子程序返回 main endp code ends end start
4.1.2 多重循环程序
多重循环——一个过程可能要依赖几个互相独立变化的参数,需 要在一个循环过程中再包含一个循环过程,形成外层循环嵌套 内层循环的结构形式。 多重循环程序设计的基本方法和单重循环程序的设计是一致的, 应考虑各层循环的控制条件及其程序实现,相互之间不能混淆。 要注意每次通过外层循环再次进入内层循环时,初始条件必须 重新设置。
例4.3 将首地址为A的N字数组按照从小到大的次序整序(气 泡算法,多重循环) A dw 32,85,16,15, 8
;……………… Dseg segment n equ 5 a equ n dup(?) Dseg ends ;……………… Cseg segment Main pric far assume cs:cseg,ds:dseg Start:mov ax, dseg mov ds, ax mov cx, n dec cx loop1:mov dx, cx mov si, 0 loop2:mov ax, a[si] cmp ax, s[si+2] jle continue xchg ax, a[si+2] mov a[si], ax continue:add bx, 2 loop loop2 mov cx, dx loop loop1 mov ax,4c00h int 21h
begin: mov ax,a ;取第1个数→ax mov bx,b ;取第2个数→bx xor ax,bx ;2个数异或,若同为奇数或同为偶数,则最低位为 test ax,0001 ;判断ax最低位是1还是0 jz class ;ax最低位为0,说明2数相同 test bx,0001 ;2数不同,判断bx是奇数还是偶数 jz exit ;bx是偶数,不用交换位置 xchg bx,a ;bx是奇数,A与b交换位置 mov b,bx class: test bx,0001 ;2数相同,是奇数还是偶数? jz exit ;2数均是偶数,则a、b两变量不变 inc b ;2数均是奇数,则a、b分别加1 inc a exit: ret main endp cseg ends end start
第四章 汇编语言程序设计基础
基本程序结构:
4.1 循环程序设计
4.1.1 基本结构的循环程序
例4.1. 把BX中的二进制数以十六进制的形式显示在屏幕上。
程序流程图
mov ch,4 rotate: mov cl, 4 rol bx,cl mov al,bl and al,0fh add al,30h ;’0’-’9’ ASCII 30H-39H cmp al,3ah jl printit add al,7h ;’A’-’F’ ASCII 41H-46H printit: mov dl,al mov ah,2 int 21h dec ch jnz rotate
data segment array dw 3 dup(?) ;定义3个字单元存放3个十六进制数 data ends code segment main proc far assume cs:code,ds:data start: push ds ;将ds:00入栈 sub ax,ax push ax mov ax,data;装填数据段地址 mov ds,ax mov cx,3 ;外循环次数→CX lea si,array;si指向十六进制数序列array首址
(2)逻辑尺控制
例. 设有数组x(x1, … , x10)和y(y1, … , y10),编程计算 z1=x1 + y1 z2=x2 + y2 z3=x3 - y3 z4=x4 - y4 z5=x5 - y5 z6=x6 + y6 z7=x7 - y7 z8=x8 - y8 z9=x9 + y9 z10=x10 + y10 逻辑关系:0 0 1 1 0 1 1 1 0 0 1代表:减法, 0代表:加法 x dw x1,x2,x3,x4,x5,x6,x7,x8,x9,x10 y dw y1,y2,y3,y4,y5,y6,y7,y8,y9,y10 z dw z1,z2,z3,z4,z5,z6,z7,z8,z9,z10 logic_rule dw 00dch ……
loop1:push cx;外循环次数进栈 mov cx,30;设置内循环次数 mov si,0;si指向第一个成绩所在单元 mov ax,grade[di] ;读取第一个成绩 mov dx,0;名次初值为0 loop2:cmp ax, grade[si] ; 与gread表中的成 绩比较 be go_on ;ax中的成绩低于表中成绩,继续比 较 inc dx ;否则,名次加1 go_on:add si,2 ;si指向下一个成绩 loop loop2 ;内循环次数不为0则循环 pop cx ;弹出外循环次数 inc dx ;名次加1 mov rank[di],dx;存名次 add di,2 ;指向下一个存放名次的单元 loop loop1 ;外循环次数不为0则循环 ret main endp cseg ends end start
input: mov ah,01;设置键盘中断,键入的值在al中 int 21h and al,0fh ;屏蔽高4位 shl dx,cl ;将十六进制数左移4位 or dl,al;用或拼成新的数 dec di ;内循环次数减1 jne input ;内循环未结束,继续输入 mov [si],dx ;内循环结束,保存十六进制数 add si,2;si指向保存下一个十六进制数的单元 pop cx ;外循环次数出栈 loop begin ;外循环未结束,继续输入下一个十六进制数 comp: lea si,array;si指向十六进制数序列array首址 mov dl,0 ;dl作显示信息,初始值为0 mov ax,[si] ;取一个十六进制数到ax mov bx,[si+2] ;与第2个十六进制数到bx cmp ax,bx ;前2个十六进制数比较 jne next1 ;前2个十六进制数不相等则转next1 add dl,2 ;前2 个十六进制数相等则dl+2
4.2 分支程序设计
4.2.1 分支程序结构
练习题3. 试编写程序,要求从键盘输入3个16进制数,并根据对 3个数的比较显示如下信息: (1)如果3个数都不相等则显示0; (2)如果3个数中有2个数相等则显示2; (3)如果3个数都相等则显示3。 说明:十六进制数的格式为:000× 000× 000× 000×=0/1 答案:
练习题4. 已知整数变量A和B,试编写完成下述操作的程序: (1)若两个数中有一个是奇数,则将该奇数存入A中,偶数存 入B中; (2)若两个数均为奇数,则两数分别加1,并存回原变量; (3)若两个数均为偶数,则两变量不变。 答案: dseg segment a dw ? b dw ? dseg ends cseg segment main proc far assume cs:cseg,ds:dseg start: push ds ;ds:00入栈 sub ax,ax push ax mov ax,dseg ;装填数据段地址 mov ds,ax
练习题5. 把0~10010之间的30个数,存入首地址为GRAD的字数组中, GRAD+i表示学号为i+1的学生成绩。另一个数组RANK是30个学生的名次表, 其中RANK+i的内容是学号为i+1的学生的名次。试编写程序,根据GRAD中的 学生成绩,将排列的名次填入RANK数组中(提示:一个学生的名次等于成绩 高于这个学生的人数加1)。 答案: Dseg segment grade dw 30 dup(?) ;存放成绩的30个字单元 rank dw 30 dup(?) ;存放名次的30个字单元 Dseg ends cseg segment main proc far assume cs:cseg, ds:dseg, es:dseg start: push ds ;ds:00入栈 sub ax,ax push ax mov ax,dseg ;装填用户数据段及附加段地址 mov ds,ax mov es,ax begin:mov di,0 ;di指向第一个名次所在单元 mov cx,30 ;设置外循环次数