微机原理汇编实验的软件部分
本文档包含了微机原理汇编实验的软件部分,仅供参考
e1.txt
;1:编程将(AX)=2387、(BX)=192FH、(CX)=9256中的无符号数按由大到
;小的顺序排序,上机编程调试出程序,并将排序结果记录在下面。
code segment
assume cs:code
start: mov ax,2387
mov bx,192fh
mov cx,9256
cmp ax,bx
jae next1
mov dx,ax
mov ax,bx
mov bx,dx
next1: cmp bx,cx
ja next2
mov dx,bx
mov bx,cx
mov cx,dx
next2: cmp ax,bx
jae next3
mov dx,ax
mov ax,bx
mov bx,dx
next3:
mov ah,4ch
int 21h
code ends
end start
*********************************
e2.txt
; 2:编程将(BX)=8600H、(CX)=3489H、(DX)=9235按有符号数由大到小
;排序,上机编程调试出程序,并将排序结果记录在下面。
code segment
assume cs:code
start: mov bx,8600h
mov cx,3489h
mov dx,9235
cmp bx,cx
jge next1
mov ax,bx
mov bx,cx
mov cx,ax
next1: cmp cx,dx
jge next2
mov ax,cx
mov cx,dx
mov dx,ax
next2: cmp bx,cx
jge next3
mov ax,bx
mov bx,cx
mov cx,ax
next3: mov ah,4ch
int 21h
code ends
end start
*********************************
e3.txt
; 3:在数据段中定义如下数据:32,34,89H,,编程将以上数据按有符号数
;进行排序,并将结果记录下来。
data segment
num db 32,34,89h
data ends
code segment
assume cs:code,ds:data
start: mov ax,data
mov ds,ax
lea si,num
mov al,[si]
cmp al,[si+1]
jge next1
mov bl,[si+1]
mov [si],bl
mov [si+1],al
next1: mov al,[si+1]
cmp al,[si+2]
jge next2
mov bl,[si+2]
mov [si+1],bl
mov [si+2],al
next2: mov al,[si]
cmp al,[si+1]
jge next3
mov bl,[si+1]
mov [si],bl
mov [si+1],al
next3: int 3
mov ah,4ch
int 21h
code ends
end start
*********************************
e4.txt
;4:在数据段中定义如下数据:99,25,86,编程将以上数据按无符号数进行排序,
;上机调试出程序,并将结果记录下来。
data segment
nums db 99,25,86
data ends
code segment
assume cs:code,ds:data
start: mov ax,data
mov ds,ax
lea si,nums
mov al,[si]
cmp al,[si+1]
jae next1
mov ah,[si+1]
mov [si+1],al
mov [si],ah
next1: mov al,[si+1]
cmp al,[si+2]
jae next2
mov ah,[si+2]
mov [si+2],al
mov [si+1],ah
next2: mov al,[si]
cmp al,[si+1]
jae next3
mov ah,[si+1]
mov [si+1],al
mov [si],ah
next3: int 3
mov ah,4ch
int 21h
code ends
end start
*********************************
e5.txt
; 5:(AL)=86H,(AH)=34H,(BL)=78H,编程将以上数据按有符号数进行排序,
;上机调试出程序,并将结果记录下来。
code segment
assume cs:code
start: mov al,86h
mov ah,34h
mov bl,78h
cmp al,ah
jge next1
mov ch,al
mov al,ah
mov ah,ch
next1: cmp ah,bl
jge next2
mov ch,bl
mov bl,ah
mov ah,ch
next2: cmp al,ah
jge next3
mov ch,al
mov al,ah
mov ah,ch
next3: int 3
mov ah,4ch
int 21h
code ends
end start
*********************************
e6.txt
; 6:中断向量为:1234H:5678H,编程将此数据设置成为类型号0对应的中断向
;量,上机调试出程序,并将结果记录下来。(直接用MOV 指令写入即可)
code segment
assume cs:code
start: mov ax,0
mov ds,ax
mov [si],5678h
mov [si+2],1234h
int 0
mov ah,4ch
int 21h
code ends
end start
*********************************
e7.txt
; 7:中断向量为:3456H:6678H,编程将此数据设置成为类型号60h对应的中断’
;向量,上机调试出程序,并将结果记录下来。(直接用MOV 指令写入即可)
code segment
assume cs:code
start: mov ax,0
mov ds,ax
mov ax,60h
mov bx,4
mul bx
mov si,ax
mov [si],6678h
mov [si+2],3456h
int 60h
mov ah,4ch
int 21h
code ends
end start
*********************************
e8.txt
; 8:中断向量为:编程将中断向量类型号为60H所对应的中断向量从中断向量表
;中取出来分别放在ES和DI中,上机调试出程序,并将程序和结果记录下来。
;(直接用MOV 指令即可)
code segment
assume cs:code
start: mov ax,0
mov ds,ax
mov ax,60h
mov bx,4
mul bx
mov si,ax
mov es,[si]
mov di,[si+2]
mov ah,4ch
int 21h
code ends
end start
*********************************
e9.txt
; 9:中断向量为:编程将中断向量类型号21H所对应的中断向量从中断向量表中
;取出来分别放在SI和BP中,上机调试出程序,并将程序和结果记录下来。
;(直接用MOV 指令即可)
code segment
assume cs:code
start: mov ax,0
mov ds,ax
mov ax,21h
mov bx,4
mul bx
mov di,ax
mov si,[di]
mov bp,[di+2]
mov ah,4ch
int 21h
code ends
end start
*********************************
e10.txt
; 10:中断向量为:编程将中断向量类型号45H所对应的中断向量从中断向量表
;中取出来分别放在DI和BP中,上机调试出程序,并将程序和结果记录下来。
;(直接用MOV 指令即可)
code segment
assume cs:code
start: mov ax,0
mov ds,ax
mov ax,45h
mov bx,4
mul bx
mov si,ax
mov di,[si]
mov bp,[si+2]
int 45h
mov ah,4ch
int 21h
code ends
end start
*********************************
e21.txt
;21:用A命令汇编一条INT 21H 指令,用命令T单步执行该指令, 比较指令执行前后CS和IP、堆栈指针SP及堆栈内容变化情况。
;此题见软件实验一的第五题
*********************************
e22.txt
;22:用命令A汇编下列程序段,用命令T 跟踪执行,判断程序段能否完成指定功能。
;程序段完成将DS:2000H开始的 5 个字节内存内容相加,
;并把相加的结果存放在DS:2005H 和 DS:2006H 内存单元中,注意:要考虑进位。
;修改后的程序如下,程序主要错误:没有考虑最高位进位
MOV CX,5
MOV AX,0
MOV BX,2000H
next: ADD AL,[BX]
INC BX
;DEC CX
JNC next1
inc ah
next1: LOOP next ; (CX)-1->(CX), (CX)≠0转next
MOV [BX],AL
inc bx
mov [bx],ah
*********************************
e23.txt
;23:编写完整的汇编语言程序,实现两个双字的加法,
;假设第一个操作数是10008423H,放在2000H处,
;第二个操作数是2007F00H,放在了3000H处。
;本程序将结果高位放在了CX,低位放在了DX
;10008423h+2007f00h=12010323h
data segment
n db 2000h dup(?) ;为将加数防在2000H,凑出的数
add 1dw 8423h,1000h
m db 0ffch dup(?) ;原因类似于上一个
add 2dw 7f00h,200h
data ends
code segment
assume cs:code,ds:data
start: mov ax,data
mov ds,ax
mov ax,ds:[2000h];直接寻址
mov bx,ds:[3000h]
add ax,bx
mov dx,ax
mov ax,ds:[2002h]
mov bx,ds:[3002h]
add ax,bx
mov cx,ax
mov ah,4ch
int 21h
code ends
end start
*********************************
e24.txt
;24:编写完整的汇编语言程序,
;实现:把“Hello,Liaocheng University”传送到另外一个段的内存单元处,
;注意:不准使用mov sb/mov sw指令。
data1 segment
lcu db ‘Hello, liaochengUniversity’,’$’ ;用$作为结束的标志
data1 ends
data2 segment
lcu2 db ?
data2 ends
code segment
assume cs:code,ds:data1
start: mov ax,data1
mov ds,ax
lea si,lcu
lea di,lcu2
lop: mov al,[si]
cmp al,’$’
je fin
mov es:[di],al
inc si
inc di
jmp lop
fin:
mov ah,4ch
int 21h
code ends
end start
*********************************
e25.txt
;25:用D命令查看中断向量表, 查找int 17h对应的中断向量,
并把中断向量修改为:1234H:5678H。
17*4=5ch 020a:058b
d 0000:5c
e 0000:5c
78 56 34 12
*********************************
e26.txt
;26:编写完整的汇编语言程序,把内存3000H:2000H起30个字节数据传送到内存 2000H:1000H开始处。
;用MOV S(或者直接用MOV )
code segment
assume cs:code
start: mov ax,3000h
mov ds,ax
mov ax,2000h
mov es,ax
mov cx,30
mov si,2000h
mov di,1000h
cld
rep mov sb
mov ah,4ch
int 21h
code ends
end start
*********************************
e27.txt
;27:编写完整的汇编语言程序,实现:显示字符串“Hello World!”,并利用debug跟踪该程序的执行过程。
;程序同31或者33
*********************************
e28.txt
;28:编写完整的汇编语言程序,
;实现子程序的功能演示
*********************************
e29.txt
;29:自编程序或者利用debug,
说明T、P、G命令的不同之处
*********************************
e30.txt
;30:说明可读写内存RAM和只读内存ROM的区别,并利用debug演示
;软件第一个实验的第四题
用D命令查看
1)DS:200~22FH和F000:200~22FH两内存块内容
2)用命令F将字符‘A’分别填入这两个内存块
温馨提示:F000:0之后的为ROM
*********************************
e31.txt
;31:编写完整的汇编语言程序,实现:显示字符串“Hello World!”,
;注意:不准使用AH=9的DOS系统功能调用,
;提示:可以使用AH=2的DOS系统功能调用(字符显示功能)。
data segment
string db ‘Hello World!’
data ends
code segment
assume cs:code,ds:data
start: mov ax,data
mov ds,ax
mov cx,12
lea si,string
lop: mov dl,[si]
mov ah,02h
int 21h
inc si
loop lop
mov ah,4ch
int 21h
code ends
end start
*********************************
e32.txt
;32:判断指令正误,并且把错误的指令改正过来。
1)ROR AX,8 ;8>1,8>>cl
2)LEA DI,[AX] ;bx,bp,si,di
3)MOV DS,2010 ;段寄存器不能直接赋植立即数
4)PUSH AL ;十六位操作数
5)OUT A00,AL ;A00>ff,A00>>DX
6)MOV [BX],0 ;未指明立即数的类型
7)POP CS ;不能给CS赋值
8)XCHG AL,[SI] ;
9)XCHG [DI],[SI];不能两个同为内存操作数
10)MOV AL,[DX] ;同2
*********************************
e33.txt
;33:找出下列程序段的错误(不止一处),并改正过来。
date segment
string db ‘Hello, World !’,’$’;定义字符串
date ends
code segment
assume cs:code, ds:date
start: mov ax,date ;data->date
mov ds,ax
mov dx,offset string;str->string
mov ah,9 ;调用09字符串显示功能
int 21h ;21->21h
mov ah,4ch ;ax->ah
int 21h ;21->21h
code ends
end start
*********************************
e34.txt
;34:将ASCII码形式表示的各位转换成为16进制的数,并且把结果合并后放在BX中。
;ASCII码:31h,41h,32h,42h
data segment
nums db 31h,41h,32h,42h
data ends
code segment
assume cs:code,ds:data
start: mov ax,data
mov ds,ax
mov ch,4
lea si,nums
lop: mov al,[si]
mov ah,0
sub ax,30h
cmp ax,9
jbe con
sub ax,7
con: add dx,ax
inc si
dec ch
jz fin
mov cl,4
shl dx,cl
jmp lop
fin: int 3 ;duan dian
mov ah,4ch
int 21h
code ends
end start
*********************************
e35.txt
;35:将16进制的数转换成为ASCII码,并且把结果显示出来。
;16进制数:1A2Bh
code segment
assume cs:code
start: mov bx,1A2Bh
mov ch,4
lop: mov cl,4
rol bx,cl
mov dl,bl
call disp
dec ch
jnz lop
mov ah,4ch
int 21h
disp proc
and dl,0fh
cmp dl,9
jbe next
add dl,7
next: add dl,30h
mov ah,2
int 21h
ret
disp endp
code ends
end start
*********************************
e36.txt
;36:下列程序完成两个5位十进制数的加法,分别放在data1和data2的符号地址处,
;请找出如下程序的错误之处,并改正过来。
data segment
data1 db 08h,02h,03h,03h,02h
data2 db 03h,05h,01h,04h,05h
data ends
code segment
assume cs:code
start: mov ax,data
mov ds,ax
lea si,data1
mov di,offset data2;更改mov di,seg data2
mov cx,5
clc ;添加
p1: mov al,[si]
add al,[di]
aaa
mov [si],al
inc di
inc si ;添加
loop p1 ;更改LOOP P2
mov ah,4ch
int 21h
code ends
end start
*********************************
e37.txt
;37:编写完整的汇编语言程序,实现:以二进制的形式显示BX寄存器的内容
code segment
assume cs:code
start: mov bx,1234h
mov cx,16
lop: shl bx,1
jc one
mov dl,30h
mov ah,02h
int 21h
jmp next
one: mov dl,31h
int 21h
next: loop lop
mov ah,4ch
int 21h
code ends
end start
*********************************
e38.txt
;38:编写完整的汇编语言程序,实现:从键盘输入4个字符。
data segment
max db 5
m db 6 dup(?)
n db 23,32,56 ;用户自定义,确保输入的四个数不会覆盖掉已存在的数
data ends
code segment
assume cs:code,ds:data
start: mov ax,data
mov ds,ax
lea dx,max
mov ah,0ah
int 21h
mov ah,4ch
int 21h
code ends
end start
*********************************
e39.txt
;39:编写完整的汇编语言程序,实现:以十六进制的形式显示BX寄存器的内容
code segment
assume cs:code
start: mov bx,12abh
mov ch,4
lop: mov cl,4
rol bx,cl
mov dl,bl
call disp
dec ch
jnz lop
mov ah,4ch
int 21h
disp proc
and dl,0fh
cmp dl,9
jbe next
add dl,7
next: add dl,30h
mov ah,2
int 21h
ret
disp endp
code ends
end start
*********************************
e40.txt
;40:编写完整的汇编语言程序,实现:小写字母a,b,c,d到A,B,C,D的转换
data segment
res db 61h,62h,63h,64h ;小写字母的ASCII码
data ends
code segment
assume cs:code
start: mov ax,data
mov ds,ax
lea si,res
mov cx,4
lop: sub byte ptr [si],20h
inc si
loop lop
mov ah,4ch
int 21h
code ends
end start
*********************************