1、汇编实例汇编实例:必须懂的题目:1、X,Y, W为字节类型的数,求Z=(W-X)*10+5)/(X+Y) DSeg Segment x db 38h y db 20hw db 30hz dw ? ten db 10 DSeg endsCSeg Segment para public CODE Assume cs:CSeg,ds:DSegStart: mov ax,DSeg mov ds,ax mov bl,x add bl,y ;先求分母,存于BL mov al,w sub al,x imul ten add ax,5 idiv bl mov z,ax mov al,0 mov ah,4ch
2、int 21hCSeg ends end Start 2、X,Y 为字节类型数,求(X+Y)*8-(X-Y)*2)/16 写出完整的数据段和代码段,不用乘除指令DSeg Segment x db 38h y db 20hz db ? DSeg endsCSeg Segment Assume cs:CSeg,ds:DSegStart: mov ax,DSeg mov ds,ax mov al,x add al,y cbw mov cl,3 sal ax,cl ;(x+y)*8 Mov bx,ax mov al,x sub al,y cbw Sal ax,1 ;(x-y)*2 sub bx, ax
3、 mov cl,4 sar ax,cl ;(x+y)*8-(x-y)*2)/16 mov z,al mov al,0 mov ah,4ch int 21hCSeg ends end Start 1、统计字符串中空格的个数和字符串长度,字符串以$结束 DSeg Segment Buf db FDSHHFOEHWHLK$ cun db 0 len db 0DSeg endsCSeg Segment Assume cs:CSeg,ds:DSegStart: mov ax,DSeg mov ds,ax mov al, 0 ;存放空格个数 lea bx, buf mov ah,0 ;存放字符串长度aga
4、in: cmp byte ptrbx, $ je exit cmp byte ptr bx, 20h ;内存单元与立即数比较时要说明类型,这一句也可以成( mov dl, bx cmp dl, 20h) 20H是空格的ASC码 jne ss inc alss: inc ah inc bx jmp againexit: mov len ah mov con , al mov al,0 mov ah,4ch int 21hCSeg ends end Start2、YAi*Bi ,i=18 , Ai, Bi为字节型无符号数,分别存于NUM1和NUM2开始的连续存储单元中,结果存于REST单元中,DS
5、eg Segment num1 db 12,34,56,78,65,02,39,8num2 db 98,65,32,74,78,12,03,56result dw ?DSeg endsCSeg Segment para public CODE Assume cs:CSeg,ds:DSegStart: mov ax,DSeg mov ds,ax mov cx,8 mov bx,0 mov si,offset num1 mov di,offset num2 again: mov al,si mul byte ptrdi add bx,ax inc di inc si loop again mov
6、result,bx mov al,0 mov ah,4ch int 21hCSeg ends end Start已知数组A中包含4个互不相等的整数,数组B中包含7个互不相等的整数,编程把既在A中又在B中出现的整数存于数组C中DSeg Segment a db 23,67,2,1b db 23,35,67,5,6,7,9c db 4 dup(?) DSeg endsCSeg Segment para public CODE Assume cs:CSeg,ds:DSegStart: mov ax,DSeg mov ds,ax mov si,0 ;SI为A数组的变址寄存器 mov bx,0 ;BX为
7、C数组的变址寄存器 l: mov cx,7 ;CX中存放B数组的个数,与LOOP配合控制循环次数 mov al,asi ;取A数组中的数存AL mov di,0 ;DI为B数组的变址寄存器,下一个A数组中的数与B数组的数比较时要把DI清0l1: cmp al,bdi jne next mov cbx,al inc bx next: inc di ;在循环结束前回到L1,取B数组的下一个数 loop l1 inc si ;在外循环结束前回到L,取A数组的下一个数 cmp si,4 ;4为A数组的个数 jb l ;控制外循环结束 mov al,0 mov ah,4ch int 21hCSeg en
8、ds end Start显示*DSeg Segment Msg db 0dh,0ah,$ DSeg endsCSeg Segment Assume cs:CSeg,ds:DSegstart: mov ax,dseg mov ds,ax mov bx,9 ;第一行的字符个数lp: mov cx,bx ;字符个数送cx,为循环次数lop: mov dl,* ;以下3句为显示字符* mov ah,2 int 21h loop lop lea dx,msg ;以下3句回车换行 mov ah,09h int 21h dec bx dec bx cmp bx,1 ;BX2,判断,如果=0转l1 INC a
9、2 ;负数 JMP L3L1: je l2 ;=0转L2 INC a1 ;正数 JMP L3L2: INC a3 ;零L3: ADD SI,2 LOOP LOP LEA DX,STR1 ;显示正数的字符串 MOV AH,09H INT 21H mov bh,0 mov bl,a1 CALL DISP ;通过调用显示子程序显示正数的个数,子程序中的要显示的数字存于bx中 LEA DX,STR4 ;回车换行 MOV AH,09H INT 21H LEA DX,STR2 MOV AH,09H INT 21H mov bl,a2 CALL DISP LEA DX,STR4 ;回车换行 MOV AH,0
10、9H INT 21H LEA DX,STR3 MOV AH,09H INT 21H mov bl,a3 CALL DISP MOV AH,4CH INT 21HDISP PROC ;显示BX中的数 mov ch,4roll: mov cl,4 rol bx,cl mov dl,bl and dl,0fh cmp dl,9 jbe next1 add dl,07hnext1: add dl,30h mov ah,02h int 21h dec ch jnz roll RETDISP ENDPCODE ENDS END START2、编写子程序搜索指定字符缓冲区中是否有n,如果有用y替代。调用子程
11、序将BUF1,BUF2,BUF3中的n全部用y替代data segment buf1 db I am a student!,$ len1=$-buf1 buf2 db ewfhefnfn,$ len2=$-buf2 buf3 db hdinky,$ len3=$-buf3 m db 13,10,$data endscode segment assume cs:code, ds:datastart:mov ax,data mov ds,ax lea si,buf1 mov cx,len1 call cmmp lea si,buf2 mov cx,len2 call cmmp lea si,buf
12、3 mov cx,len3 call cmmp mov ah,4ch int 21h;子程序的功能:搜索字符串中是否有n字符,如果有用y替代,并显示字符串;入口参数为字符串偏移地址SI,字符串长度CXcmmp proc mov dx,si ;将要显示的字符串的偏移地址送DX,用于显示字符串。这句应在子程序的开始,因为下面语句会改变SI的值l1: cmp byte ptrsi,n jnz l2 mov al,y mov si,al l2: inc si loop l1 mov ah,09h ;显示字符串 int 21h lea dx,m ;回车换行 int 21h retcmmp endpcod
13、e ends end start在buf开始的存储单元中查找字符E,找到后删除E后面的2个字符,并显示字符串。DATA SEGMENTCOUN DB 20BUF DB ABCDEFGHIJKLMNOPQRSTDATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,ES:DATA ;START:MOV AX,DATA MOV DS,AX MOV ES,AX LEA DI,BUF MOV CL,COUN ;查找字符E MOV AL,E CLD REPNE SCASB JZ FOUND JMP DONE ;找到E后,DI指向E后面的第一个字符,将SI指向E后面的的3个
14、字符,进行字符串传送FOUND:MOV SI,DI ; ADD SI,2 ; SUB CL,2 ; CLD REP MOVSB ;显示字符串 MOV BYTE PTR BUF+18,$ ;DONE: LEA SI,BUF MOV DX,SI MOV AH,9 INT 21H MOV AH,4CH INT 21HCODE ENDS END START;将数据段中的数字改成*STACKS SEGMENT STACK DW 128 DUP(?)STACKS ENDS DSeg Segment string db di2h4nl5jhlcount equ $-stringDSeg endsCSeg S
15、egment para public CODE Assume cs:CSeg,ds:DSegStart: mov ax,DSeg mov ds,ax mov cx,count ;设置循环次数 mov si,offset string again: mov al,si cmp al,0 jb next cmp al,9 ja next mov al,* mov si,al next: inc si loop again ;字符个数减1,不为0继续循环Done: mov al,0 mov ah,4ch int 21hCSeg ends end Start ;从键盘输入一个字符串,并把它显示出来ST
16、ACKS SEGMENT STACK DW 128 DUP(?)STACKS ENDS DSeg Segment cf db 0dh,0ah,$msg db 20,?,20 dup(?)DSeg endsCSeg Segment para public CODE Assume cs:CSeg,ds:DSegStart: mov ax,DSeg mov ds,ax lea dx,msg mov ah,0ah int 21h ;系统等待键盘输入字符串 lea dx,cf mov ah,09h int 21h Mov bl,m送到bx寄存器 Mov bh,0 mov msg+2bx,$ ;msg+2
17、+bx单元是字符串的结尾,显示的字符串要以$结束,在字符串的结束处加$ lea dx,msg+2 mov ah,09h int 21h mov al,0 mov ah,4ch int 21hCSeg ends end Start 显示十六进制数的子程序DISP PROC ;显示BX中的数 mov ch,4roll: mov cl,4 rol bx,cl mov dl,bl and dl,0fh cmp dl,9 jbe next1 add dl,07hnext1: add dl,30h mov ah,02h int 21h dec ch jnz roll RETDISP ENDP;内存首地址为
18、BUF 的10个字节数,累加求和,结果存于RESULT中STACKS SEGMENT STACK DW 128 DUP(?)STACKS ENDS DSeg Segment Buf db 3,4,56,7,8,-3,7,3,6,9 Res db ?DSeg endsCSeg Segment para public CODE Assume cs:CSeg,ds:DSegStart: mov ax,DSeg mov ds,ax mov al, 0 lea bx, buf mov cx, 10aga: add al, bx inc bx loop aga mov res , al mov al,0
19、mov ah,4ch int 21hCSeg endssg+1 ;字符串长度放在msg+1, end Start ;程序段也可以写成 mov al, 0 mov?bx,?0? mov?cx,?10aga:? add?al,?bufbx? inc?bx? ?loop?again mov res , al;内存首地址为BUF 的10个字节数,求0的个数,并显示出来。STACKS SEGMENT STACK DW 128 DUP(?)STACKS ENDS DSeg Segment BUF DB 0,-1,2,4,3,-4,5,6,-7,0RESULT db 0 DSeg endsCSeg Segm
20、ent para public CODE Assume cs:CSeg,ds:DSegStart: mov ax,DSeg mov ds,ax MOV AL, 0 ;存放0的个数 LEA SI,BUF MOV CX,10LOP: CMP BYTE PTRSI, 0 JNE L3 INC AL ;0的个数L3: INC SI LOOP LOP MOV BL,AL MOV BH,0 CALL DISP ;调用显示子程序 mov al,0 mov ah,4ch int 21h DISP PROC ;显示BX中的数 mov ch,4roll: mov cl,4 rol bx,cl mov dl,bl
21、and dl,0fh cmp dl,9 jbe next1 add dl,07hnext1: add dl,30h mov ah,02h int 21h dec ch jnz roll RETDISP ENDPCSeg ends end Start ;有数据段STACKS SEGMENT STACK DW 128 DUP(?)STACKS ENDS DSeg Segment buf dw 12,34,-45,-567,35,-54,23,-56,-432,-78,-678,43,76,321,761, -890,670,125,987,912 buf1 dw 20 dup(?)buf2 dw
22、20 dup(?)DSeg endsCSeg Segment para public CODE Assume cs:CSeg,ds:DSegStart: mov ax,DSeg mov ds,ax mov cx,20 lea bx,buf lea si,buf1 lea di,buf2again: mov ax,bx cmp ax,0 jl l mov si,ax inc si inc si jmp next l: mov Di,ax inc di inc di next: inc bx inc bx loop again mov al,0 mov ah,4ch int 21hCSeg end
23、s end Start ;将一个字符串中的所有大写字母改为小写字母,字符串以0结尾。STACKS SEGMENT STACK DW 128 DUP(?)STACKS ENDS DSeg Segment String db AHLGLKNDLJ,0DSeg endsCSeg Segment para public CODE Assume cs:CSeg,ds:DSegStart: mov ax,DSeg mov ds,ax mov bx,offset stringagain: mov al,bx ;取一个字符 or al,al ;是否为结尾符0 jz done ;是,退出循环 cmp al,A
24、;是否为大写AZ jb next cmp al,Z ja next or al,20h ;是,转换为小写字母 mov bx,al ;仍保存在原位置next: inc bx jmp again ;继续循环done: mov al,0 mov ah,4ch int 21hCSeg ends end Start ;YAi*Bi ,i=18 , Ai, Bi为字节型无符号数,分别存于NUM1和NUM2开始的连续存储单元中,结果存于REST单元中。请同学们用另一种方法做,并把结果显示在屏幕上DSeg Segment num1 db 12,34,56,78,65,02,39,8num2 db 98,65,
25、32,74,78,12,03,56result dw ?DSeg endsCSeg Segment para public CODE Assume cs:CSeg,ds:DSegStart: mov ax,DSeg mov ds,ax mov cx,8 mov bx,0 mov si,offset num1 mov di,offset num2 again: mov al,si mul byte ptrdi add bx,ax inc di inc si loop again mov result,bx mov al,0 mov ah,4ch int 21hCSeg ends end Star
26、t;在首地址为MSG1的字数组中存放了10个16进制数,求出平均数,以及大于平均数的数个数,存放在count单元中.DSeg Segment Msg1 dw 300H,300H,300H,300H,300H,100H,100H,100H,100H,100Hlen dw 10 Msg2 dw ? ;存放平均数 count db 0 ;大于平均数的数的个数 DSeg endsCSeg Segment para public CODE Assume cs:CSeg,ds:DSegStart: mov ax,DSeg mov ds,ax ;求和 lea si,msg1 mov ax, si mov cx,9 pp: add si,2 add ax,si loop pp ;求平均数 mov dx,0 idiv len mov msg2,ax ;求大于平均数的个数 mov cx,len le
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1