汇编实验


实验前言

DEBUG 的常用命令
(1)汇编命令 A
         举例:
            1)命令:A               含义:从默认地址输入汇编指令
            2)命令:A 1000:20 含义:从地址为1000H:20H的单元输入汇编指令;
            3)命令:A CS:1000 含义:从CS段的1000H单元输入汇编指令;

(2)反汇编命令 U
         举例:
           1)命令:U      含义:查看默认地址的汇编指令,默认条数;
           2)命令:U  0  含义:从0地址查看汇编指令,默认CS段;
           3)命令:U  0  50  含义:查看地址0到50H的汇编指令,默认CS段;
地址范围要确认该范围中所有指令都是完整的。
          4)命令:U   DS:0 含义:将DS:0地址中的内容当作指令,查看默认条数;

(3)显示、修改寄存器命令 R
         举例:
          1)命令:R         含义:查看所有寄存器内容;
          2)命令:R  ax   含义:查看寄存器AX中的内容,并可修改;

(4)显示存储单元命令 D
        举例:
          1)命令:D         含义:默认查看;
          2)命令:D   1000:0   含义:从指定单元查看数据,默认长度;
          3)命令:D    DS:0       含义:从指定单元查看DS段中的数据,默认长度;
          4)命令:D    0    5       含义:查看DS段中0~5单元中的6个数据;
          5)命令:D   10   L   5    含义:查看DS段中从10H开始的连续5个单元内容;

(5)修改存储单元命令 E
         举例:
        1)命令:E  100
           含义:查看DS段中100H单元起始的存储单元内容,并可随时修改;
        2)命令:E   ES:10   1   31  20
           含义:将ES段中地址为10H~12H的3个单元中的值修改为1、31H、20H;
        3)命令:E   10    ‘ABCD’
           含义:将DS段中地址10H13H的连续4个单元内容修改为41H44H;

(6)运行命令 G
         举例:
         1)命令:G         含义:从当前位置连续执行程序,到结束;
         2)命令:G=0     含义:从0地址连续执行程序,到结束;
         3)命令:G   14   含义:从当前位置执行程序到14H,中断;
         4)命令:G=3    20   含义:从地址3执行程序到地址20H,中断;

(7)跟踪命令 T
         举例:
         1)命令:T        含义:从当前位置单步执行1条指令;
         2)命令:T   3   含义:从当前位置单步执行3条指令;
         3)命令:T=0    含义:从0地址单步执行1条指令;
         4)命令:T=4   2   含义:从4地址单步执行2条指令;

(8)退出命令 Q
格式:Q
功能:退出DEBUG,返回到操作系统。


预备实验

(1)程序功能:在屏幕上显示char变量所定义的字符。

data segment
char db 'f'
data ends
code segment
    assume cs:code,ds:data
start: mov ax,data
       mov ds,ax
	   mov dl,char
	   mov ah,2
	   int 21h
	   mov ax,4c00h
	   int 21h
code ends
end star

(2)程序功能:从键盘上输入一个字符串,保存于数据段中,分别显示该字符串的长度和字符串中第二个字符。

data segment
  inmess db 'Please input a string(length<9):$'
  lenmess db 0ah,0dh,'The length of the string is:$'
  charmess db 0ah,0dh,'The second char of the string is:$'
  instring db 10,?,10 dup(?)
data ends
code segment
  assume cs:code,ds:data
start: mov ax,data
       mov ds,ax
       
       lea dx,inmess ;显示提示信息
       mov ah,09h
       int 21h
  
       lea dx,instring ;输入字符串,保存于instring
       mov ah,0ah   ; ds:dx = 缓冲区首地址; (ds:dx)=缓冲区最大字符数
       int 21h      ; 返回参数:(ds:dx+1)=实际输入的字符数

       lea dx,lenmess  ;显示提示信息
       mov ah,09h      ;显示字符串 ds:dx=串地址 '$'结束字符串
       int 21h

       lea bx,instring ;获取输入字符串的长度值,并显示
       inc bx
       mov dl,[bx]
       add dl,30h
       mov ah,02h  ; 显示输出 dl = 输出字符
       int 21h

       lea dx,charmess ;显示提示信息
       mov ah,09h      ;显示字符串 ds:dx=串地址 '$'结束字符串
       int 21h

       mov dl,[bx+2] ;显示字符串中的第二个字符
       mov ah,02h    ; 显示输出 dl = 输出字符
       int 21h
     
       mov ax,4c00h ;程序返回
       int 21h
code ends
end start       

代码中加30h的原因:从键盘上读入的数存入计算机的其实是其对应的ASCII值。比如输入 1 其实存的是 31h 所以我们在读入1后,为了更好的进行加法运算,先减去30h,这样计算机中存的就是1h了,便于我们平常的加法运算。同理,得到的长度加30h即其对应的ASCII值。


实验一 :基本编程方法练习

(1)从键盘接收两个不大于5的十进制数字,并以十进制数据形式显示其和。

data segment
X db 'please input num a = : $'
Y db 'please input num b = : $'
data ends
code segment
   assume cs:code,ds:data
start: 
	mov ax,data
	mov ds,ax

	lea dx,x
	mov ah,09h  ;显示字符串 ds:dx=串地址 '$'结束字符串
	int 21h
	
	mov ah,01h  ;键盘输入并回显 AL=输入字符
	int 21h
	mov ah,0
	mov bx,0    ;用bx暂存一个数顾先清零
	mov bl,al

	lea dx,y
	mov ah,09h  ;显示字符串 ds:dx=串地址 '$'结束字符串
	int 21h

	mov ah,01h  ;键盘输入并回显 AL=输入字符
	int 21h

	add bl,al
	sub bl,30h   ;再减30h上面已经做出解释
	mov dl,bl
	mov ah,02h   ; 显示输出 dl = 输出字符
	int 21h

	mov ax,4c00h
	int 21h
code ends
end start

(2)从键盘接收一个字符串(假定输入字符串长度大于3),试换行输出该字符串中第二个字符开始的连续2个字符。

data segment
    str1 db 'Please input a string(length>3): $'
    str2 db 10,?,20 dup(?)
data ends
code segment
    assume cs:code,ds:data
start:  mov ax,data
        mov ds,ax
		
	    lea dx,str1  ;显示提示信息
		mov ah,09h   ;显示字符串 ds:dx=串地址 '$'结束字符串
		int 21h
		
		lea dx,str2
		mov ah,0ah  ; ds:dx = 缓冲区首地址; (ds:dx)=缓冲区最大字符数
		int 21h     ; 返回参数:(ds:dx+1)=实际输入的字符数
		
		mov dl,10   ;换行是0ah 
		mov ah,02h  ; 显示输出 dl = 输出字符
		int 21h
		
		mov dl,13   ; 回车是0dh。换行回车输出字符串
		mov ah,02h  ; 显示输出 dl = 输出字符
		int 21h

 		mov dl,[str2+3]  ;加三是因为[str+1]存储的是串长
		mov ah,02h       ; 显示输出 dl = 输出字符
		int 21h
		mov dl,[str2+4]
		mov ah,02h  ; 显示输出 dl = 输出字符
		int 21h
		
		mov ax,4c00h  ;程序返回
		int 21h
code ends
end start

(3)试将字节数据B1 拆分成两个半字节数据,分别存放于其后两个单元X 和Y 中。

data segment
    b1 db 12h
	x db ?
	y db ?
data ends
code segment
    assume cs:code,ds:data
start: 
        mov ax,data
        mov ds,ax
	   
	    mov al,b1
		mov ah,al
	    mov cl,4
		shr ah,cl
		mov x,ah
		and al,ofh
		mov y,al
	   
	    mov ax,4c00h
	    int 21h
code ends
end start

实验二:分支循环结构程序练习

《1》试编写程序,完成以下功能。
(1)程序执行时,显示提示信息“Please input a string(length<9):”,由用户输入一个长度小于9的字符串;
(2)然后显示提示信息“Please input the index of the char to display:”,请用户指定该串中的某个字符的位置号,程序控制用户输入的位置号必须是合法的,例如实际输入字符串长度为5个字符,位置号只能是0-4之间的数值;若位置号不合法,则程序退出。
(3)程序将用户指定位置的字符显示出来。

data segment
   s1 db 'Please input a string(length<9):$'
   s2 db 0ah,0dh,'Please input the index of the char to display:$'
   s3 db 0ah,0dh,'The char is:$'
   s4 db 0ah,0dh,'The index is invalid!$'
   buf db 10,?,10 dup(?)
   index db ?
data ends
code segment
    assume cs:code,ds:data
start: 
    mov ax,data
    mov ds,ax
	
	lea dx,s1
	mov ah,09h   ;显示字符串 ds:dx=串地址 '$'结束字符串
	int 21h
	
	lea dx,buf
	mov ah,0ah  ; ds:dx = 缓冲区首地址; (ds:dx)=缓冲区最大字符数
	int 21h     ; 返回参数:(ds:dx+1)=实际输入的字符数
		
	lea bx,buf
	inc bx
	mov cl,[bx] ;cl存储字符串长度
	
	lea dx,s2
	mov ah,09h   ;显示字符串 ds:dx=串地址 '$'结束字符串
	int 21h
	
	mov ah,01h
	int 21h
	sub al,30h
	mov index,al
	
	cmp cl,al
	jng error  ;cl不大于al时跳转,实际是al < cl 才合法  jng 等价于 JLE
	
	lea dx,s3
	mov ah,09h   ;显示字符串 ds:dx=串地址 '$'结束字符串
	int 21h
	
	mov bl,index 
	mov bh,0
	mov dl,buf[bx+1] ;bx+1此时指向字符串第一个字符,所以[bx+1]就是所求位号
	mov ah,02h  ; 显示输出 dl = 输出字符
	int 21h
	
	mov ax,4c00h
	int 21h

error:
    lea dx,s4
  	mov ah,09h   ;显示字符串 ds:dx=串地址 '$'结束字符串
	int 21h
	mov ax,4c00h
	int 21h

code ends
end start

《2》试使用分支结构和循环结构程序完善上面的程序功能。
(1)采用01号DOS功能调用,接收用户输入的字符串,并在程序中对字符串进行长度检查,若长度大于9,则要求用户重新输入;
(2)用户在指定位置号时,进行判断,若输入非法(位置号大于实际字符串长度),则提示用户重新输入;若输入位置号合法,则显示字符串中该位置号对应的字符。
(3)统计用户输入的字符串中特定字符的数目并显示。可先指定特定字符进行统计,然后再由用户指定字符进行统计。

data segment
    s1 db "Please input a string(length<9):$"
	s2 db "Please input the index of the char to display:$"
    s3 db "The char is:$"
    s4 db "The index is invalid!$"
    s5 db "Please input a char:$"
    s6 db "The count is : $"
    s7 db "The string is too long!$"
	str1 db 20,?,20 dup('$')   ;第一个字节存20,第二个未知,剩余连续20个字节存‘$’
	x db ?
data ends
code segment
    assume cs:code,ds:data
start:  mov ax,data
        mov ds,ax
	    
	t1:	lea dx,s1
	    mov ah,09h
		int 21h
		
		lea dx,str1
		mov ah,0ah
		int 21h
		
		mov dl,10
		mov ah,02h
		int 21h
		mov dl,13
		mov ah,02h
		int 21h
		
		cmp str1+1,8
		ja error1
		
	t2:	lea dx,s2
	    mov ah,09h
		int 21h
		
		mov ah,01h
		int 21h
		sub al,30h
		mov cl,al
		
		mov dl,10
		mov ah,02h
		int 21h
		mov dl,13
		mov ah,02h
		int 21h
		
		mov bl,str1+1
		dec bl
		cmp cl,bl
	    ja error2  ; cl > bl 时跳转 与JNBE等效

	    mov bl,cl
		mov bh,0
		mov al,str1[bx+2]
		
        lea dx,s3
 		mov ah,09h
  		int 21h

		mov dl,al
		mov ah,02h
		int 21h
		
		mov dl,10
		mov ah,02h
		int 21h
		
        lea dx,s5
 		mov ah,09h
  		int 21h
		mov ah,01h
		int 21h
		
		xor cx,cx
		mov cl,str1[1]
		mov bx,-1
		mov dl,0
		
	t3: inc bx
	    cmp al,str1[bx+2]
		jnz t4    ;不为零时跳转
		inc dl
		
	t4: loop t3
	
	    add dl,30h
		mov cl,dl
		
		mov dl,0ah
		mov ah,2
		int 21h
		mov dl,0dh
		mov ah,2
		int 21h
		
        lea dx,s6
 		mov ah,09h
  		int 21h

		mov dl,cl
		mov ah,2
		int 21h
		
		mov ax,4c00h
	    int 21h

error1: lea dx,s7
        mov ah,09h
        int 21h
        jmp t1

error2: lea dx,s4
        mov ah,09h
        int 21h
        jmp t2    ;无条件跳转

code ends
end start

实验三:综合程序练习

《1》已知无符号字数组LIST的第一个字数据为其元素个数,其后数据按大小关系排序保存。试将某无符号字数据X插入数组LIST的正确位置,并修改元素个数。

data segment
list dw 5,20h,30h,40h,50h,60h
x dw 36h
data ends
code segment
    assume cs:code,ds:data
start: mov ax,data
       mov ds,ax
	  
	   mov ax,x
	   lea bx,list
	   mov cx,[bx]
bijiao:add bx,2
       cmp ax,[bx]
	   jc jh    ;当有进位(借位)时跳转
	   loop bijiao
jh:   xchg ax,[bx]
      add bx,2
	  loop jh    ;每循环一次寄存器cx的值减一,cx的值为零跳出循环
	  mov [bx],ax
	  inc word ptr list  ;最后将list长度加一
	  
	  mov ax,4c00h
	  int 21h
code ends
end start
  • 31
    点赞
  • 161
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

星航夜空的帆舟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值