实验一
实验二
实验三
附琐碎知识—— 汇编常用指令
1、编写子程序,其功能是将AX中的数以无符号十进制形式输出显示,然后在主程序中进行调用。(如果有入口参数或出口参数,请给出注释说明。)
子程序定义用proc 和endp,调用子程序用call指令。
DATAS SEGMENT
;此处输入数据段代码
DATAS ENDSSTACKS SEGMENT
;此处输入堆栈段代码
STACKS ENDSCODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
mov ax,2251
call output
MOV AH,4CH
INT 21H
output proc
push bx
push cx
push dx
mov cl,10
mov bl,0
L1:
div cl
push ax
add bl,1
mov ah,0
cmp ax,0
ja L1L2:
pop dx
mov dl,dh
add dl,48
mov ah,2
int 21h
sub bl,1
cmp bl,0
ja L2
pop dx
pop cx
pop bx
ret
output endp
CODES ENDS
END START
2、编写子程序,其功能是从键盘输入数字字符(例如‘1’‘2’‘6’‘a’),在程序中得到对应的数值(126),然后在主程序中进行调用。
DATAS SEGMENT
;此处输入数据段代码
DATAS ENDSSTACKS SEGMENT
;此处输入堆栈段代码
STACKS ENDSCODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
call input
mov ax,bx
call output
MOV AH,4CH
INT 21H
input proc;出口bx
push dx
push cx
push ax
mov cl,10
mov bx,0
again:
mov ah,1
int 21h
cmp al,'0'
jb over1
cmp al,'9'
ja over1
sub al,48
mov ah,0
xchg bx,ax
mul cl
add bx,ax
jmp again
over1:
pop ax
pop cx
pop dx
ret
input endp
output proc;入口ax
push bx
push cx
push dx
mov cl,10
mov bl,0
L1:
div cl
push ax
add bl,1
mov ah,0
cmp ax,0
ja L1L2:
pop dx
mov dl,dh
add dl,48
mov ah,2
int 21h
sub bl,1
cmp bl,0
ja L2
pop dx
pop cx
pop bx
ret
output endp
CODES ENDS
END START
3、在主程序中调用2中的子程序,输入4个整数,分别存放到ax,bx,cx,dx中,然后调用1中的子程序,将ax,bx,cx,dx中的值分别输出显示。
DATAS SEGMENT
;此处输入数据段代码
DATAS ENDSSTACKS SEGMENT
;此处输入堆栈段代码
STACKS ENDSCODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AXcall input
mov ax,bx
call input
mov dx,bx
call input
mov cx,bx
call input
xchg bx,dx
call output
mov ax,bx
call output
mov ax,cx
call output
mov ax,dx
call output
MOV AH,4CH
INT 21H
input proc;出口bx
push dx
push cx
push ax
mov cl,10
mov bx,0
again:
mov ah,1
int 21h
cmp al,'0'
jb over1
cmp al,'9'
ja over1
sub al,48
mov ah,0
xchg bx,ax
mul cl
add bx,ax
jmp again
over1:
pop ax
pop cx
pop dx
ret
input endp
output proc;入口ax
push bx
push cx
push dx
mov cl,10
mov bl,0
L1:
div cl
push ax
add bl,1
mov ah,0
cmp ax,0
ja L1L2:
pop dx
mov dl,dh
add dl,48
mov ah,2
int 21h
sub bl,1
cmp bl,0
ja L2
pop dx
pop cx
pop bx
ret
output endp
CODES ENDS
END START
4、回车符的ascii码是13,换行符的ascii是10,请编写回车换行子程序enters。
DATAS SEGMENT
;此处输入数据段代码
DATAS ENDSSTACKS SEGMENT
;此处输入堆栈段代码
STACKS ENDSCODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
;回车子程序
call enters
mov dl,49
mov ah,2
int 21h
MOV AH,4CH
INT 21H
enters proc
push ax
push dx
mov dl,13
mov ah,2
int 21h
mov dl,10
mov ah,2
int 21h
pop dx
pop ax
ret
enters endp
CODES ENDS
END START
1、在数据区定义一个字型变量a1,a1中有一个元素,读取a1中的值并利用输出子程序输出显示。
DATAS SEGMENT
;此处输入数据段代码
a1 word 2506
DATAS ENDSSTACKS SEGMENT
;此处输入堆栈段代码
STACKS ENDSCODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
;此处输入代码段代码
mov si,offset a1
L0:
mov ax,[si]
call output
MOV AH,4CH
INT 21H
output proc;ax入口
push bx
push cx
push dx
mov cl,10
mov bl,0
L1:
div cl
push ax
add bl,1
mov ah,0
cmp ax,0
ja L1L2:
pop dx
mov dl,dh
add dl,48
mov ah,2
int 21h
sub bl,1
cmp bl,0
ja L2
pop dx
pop cx
pop bx
ret
output endp
CODES ENDS
END START
2、在数据区定义一个字型变量a1,a1中有10个元素,读取a1中的值并利用输出子程序将10个元素输出显示。
DATAS SEGMENT
;此处输入数据段代码
a1 word 25,12,20,6,8,9,25,997,225,10
DATAS ENDSSTACKS SEGMENT
;此处输入堆栈段代码
STACKS ENDSCODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
;此处输入代码段代码
mov dl,0
mov si,offset a1
L0:
mov ax,[si]
call output
add si,2
add dl,1
cmp dl,10
jb L0
MOV AH,4CH
INT 21H
output proc;ax入口
push bx
push cx
push dx
mov cl,10
mov bl,0
L1:
div cl
push ax
add bl,1
mov ah,0
cmp ax,0
ja L1L2:
pop dx
mov dl,dh
add dl,48
mov ah,2
int 21h
sub bl,1
cmp bl,0
ja L2
pop dx
pop cx
pop bx
ret
output endp
CODES ENDS
END START
3、在数据段中定义一个变量a1,其中有1个元素,其元素类型为word类型(即一个元素占2个字节) ,利用输入子程序得到一个整数,然后将这个整数存储到a1中。
DATAS SEGMENT
;此处输入数据段代码
a1 word ?
a2 word 5 dup(?)
DATAS ENDSSTACKS SEGMENT
;此处输入堆栈段代码
STACKS ENDSCODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
;此处输入代码段代码mov si,offset a1
call input
mov [si],bx
mov si,offset a1mov ax,[si]
call output
MOV AH,4CH
INT 21H
input proc;出口bx
push dx
push cx
push ax
mov cl,10
mov bx,0
again:
mov ah,1
int 21h
cmp al,'0'
jb over1
cmp al,'9'
ja over1
sub al,48
mov ah,0
xchg bx,ax
mul cl
add bx,ax
jmp again
over1:
pop ax
pop cx
pop dx
ret
input endp
output proc;ax入口
push bx
push cx
push dx
mov cl,10
mov bl,0
L1:
div cl
push ax
add bl,1
mov ah,0
cmp ax,0
ja L1L2:
pop dx
mov dl,dh
add dl,48
mov ah,2
int 21h
sub bl,1
cmp bl,0
ja L2
pop dx
pop cx
pop bx
ret
output endp
CODES ENDS
END START
4、在数据段中定义一个变量a2,其中有5个元素(类似于数组),其元素类型为word类型(即每个元素占2个字节,5个元素占10个字节) ,调用5次题目2中的输入子程序分别得到5个整数,依次将它们存放到a2的5个元素中。
DATAS SEGMENT
;此处输入数据段代码
a1 word ?
a2 word 5 dup(?)
DATAS ENDSSTACKS SEGMENT
;此处输入堆栈段代码
STACKS ENDSCODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
;此处输入代码段代码
mov dl,0
mov si,offset a2
L0:
call input
mov [si],bx
add si,2
inc dl
cmp dl,5
jb L0
mov cl,0
mov si,offset a2
LL0:
mov ax,[si]
call output
add si,2
inc cl
cmp cl,5
jb LL0
MOV AH,4CH
INT 21H
input proc;出口bx
push dx
push cx
push ax
mov cl,10
mov bx,0
again:
mov ah,1
int 21h
cmp al,'0'
jb over1
cmp al,'9'
ja over1
sub al,48
mov ah,0
xchg bx,ax
mul cl
add bx,ax
jmp again
over1:
pop ax
pop cx
pop dx
ret
input endp
output proc;ax入口
push bx
push cx
push dx
mov cl,10
mov bl,0
L1:
div cl
push ax
add bl,1
mov ah,0
cmp ax,0
ja L1L2:
pop dx
mov dl,dh
add dl,48
mov ah,2
int 21h
sub bl,1
cmp bl,0
ja L2
pop dx
pop cx
pop bx
ret
output endp
CODES ENDS
END START
5、在数据区定义一个字节型变量a1,a1中存放了若个字符,'$'字符是其最后一个字符。编写程序,a1中的所有字符输出显示,直到‘$’结束(需要用循环实现)。
DATAS SEGMENT
;此处输入数据段代码
a1 byte "dhasucd273ABC321$"
DATAS ENDSSTACKS SEGMENT
;此处输入堆栈段代码
STACKS ENDSCODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
;此处输入代码段代码
mov si,offset a1
L0:
mov al,[si]
cmp al,'$'
je over
mov dl,al
mov ah,2
int 21h
inc si
jmp L0
over:
MOV AH,4CH
INT 21H
CODES ENDS
END START
6、编写子程序,把以‘$’结尾的字符串输出显示(有无入口参数?需要用循环实现)。
送入偏移量 压栈出栈 入口参数
DATAS SEGMENT
;此处输入数据段代码
a1 byte "dhasucd273ABC321$"
DATAS ENDSSTACKS SEGMENT
;此处输入堆栈段代码
STACKS ENDSCODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
;此处输入代码段代码
mov si,offset a1
call stoutput
MOV AH,4CH
INT 21H
stoutput proc;入口参数si
push ax
push dx
L0:
mov al,[si]
cmp al,'$'
je over
mov dl,al
mov ah,2
int 21h
inc si
jmp L0
over:pop dx
pop ax
ret
stoutput endp
CODES ENDS
END START
1、编写输出子程序,把AX中的数以二进制形式显示输出,并在主程序中验证。(需要使用循环移位指令,逻辑与指令。)
DATAS SEGMENT
;此处输入数据段代码
DATAS ENDSSTACKS SEGMENT
;此处输入堆栈段代码
STACKS ENDSCODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
;此处输入代码段代码
mov ax,65
mov bx,ax
call binary
MOV AH,4CH
INT 21H
binary proc;bx入口
push dx
push ax
push cx
mov cl,0
L0:
rol bx,1;左循环移1位
mov dx,bx
and dx,0001h;得到最低位
add dl,48;输出显示
mov ah,2
int 21h
inc cl
cmp cl,16
jb L0
pop cx
pop ax
pop dx
ret
binary endp
CODES ENDS
END START
2、编写输出子程序,把AX中的数以十六进制形式显示输出,并在主程序中验证。(需要使用循环移位指令(注意用cl存储循环移位个数),逻辑与指令。)
DATAS SEGMENT
;此处输入数据段代码
DATAS ENDSSTACKS SEGMENT
;此处输入堆栈段代码
STACKS ENDSCODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
;此处输入代码段代码
mov ax,65;65 41H 655 28F
mov bx,ax
call sexadecimal
MOV AH,4CH
INT 21H
sexadecimal proc;bx入口
push dx
push ax
push cx
mov cl,4
mov al,0
L0:
rol bx,cl
mov dx,bx
and dx,000Fh
cmp dl,10
jb L1
add dl,55
push ax
mov ah,2
int 21h
pop ax
jmp L2
L1:
push ax
add dl,48
mov ah,2
int 21h
pop ax
L2:
add al,1
cmp al,4
jb L0
mov dl,'H'
mov ah,2
int 21h
pop cx
pop ax
pop dx
ret
sexadecimal endp
CODES ENDS
END START
3、编写输出子程序,把AX中的数以两个字符的形式(把AX两个字节中的二进制序列看成字符)显示输出,并在主程序中验证。
DATAS SEGMENT
;此处输入数据段代码
DATAS ENDSSTACKS SEGMENT
;此处输入堆栈段代码
STACKS ENDSCODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
;此处输入代码段代码
;ax中数以两个字符形式显示
mov ah,'A'
mov al,'1'
call binarychar
MOV AH,4CH
INT 21H
binarychar proc
push dx
push ax
push bx
mov bx,ax
mov dl,ah
mov ah,2
int 21h
mov dl,bl
mov ah,2
int 21h
pop bx
pop ax
pop dx
ret
binarychar endp
CODES ENDS
END START
4、编写输出子程序,把AX中的数以带符号十进制形式(把AX中的二进制序列看成带符号数,ax=123,显示123,ax=-123,显示-123,参考neg指令)显示输出,并在主程序中验证。
DATAS SEGMENT
;此处输入数据段代码
DATAS ENDSSTACKS SEGMENT
;此处输入堆栈段代码
STACKS ENDSCODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
;此处输入代码段代码
;带符号十进制显示
mov ax,123
call signeddecimal;ax入口
MOV AH,4CH
INT 21H
signeddecimal proc
push dx
push bx
mov bx,ax
and ax,8000H
jz l0
neg bx
mov dl,'-'
mov ah,2
int 21h
l0:
mov ax,bx
call output
pop bx
pop dx
ret
signeddecimal endp
output proc;ax入口
push bx
push cx
push dx
mov cl,10
mov bl,0
L1:
div cl
push ax
add bl,1
mov ah,0
cmp ax,0
ja L1L2:
pop dx
mov dl,dh
add dl,48
mov ah,2
int 21h
sub bl,1
cmp bl,0
ja L2
pop dx
pop cx
pop bx
ret
output endp
CODES ENDS
END START
5、综合实验,利用之前学习的知识和写过的子程序,完成如下操作:
(1)用提示信息提示用户输入8个数,每个数输入后换行,在下一行输入下一个数;
(2)输入后在新的一行显示这8个数;
(3)然后对这8个数排序;
(4)在新的一行显示排序后的8个数。
DATAS SEGMENT
;此处输入数据段代码
a1 word 8 dup(?)
a2 byte "Please input 8 number:$"
a3 byte "the 8 nunber you input is:$"
a4 byte "After sort,the 8 nunber is:$"
DATAS ENDSSTACKS SEGMENT
;此处输入堆栈段代码
STACKS ENDSCODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
;此处输入代码段代码
;输出字符串1
mov si,offset a2
call stoutput
call enters
;输入8个整数
mov dl,0
mov si,offset a1
again1:
call input
call enters
mov [si],bx
add si,2
inc dl
cmp dl,8
jb again1
;输出字符串2
mov si,offset a3
call stoutput
;输出8个整数
mov cl,0
mov bl,0
mov si,offset a1
LL0:
mov ax,[si]
call output
cmp bl,7
je w1
mov dl,44
mov ah,2
int 21h
inc bl
w1:
add si,2
inc cl
cmp cl,8
jb LL0
call enters
;输出字符串3
mov si,offset a4
call stoutput
;调用排序子程序
;
mov di,0
mov cx,7
L9:
call sort
add di,2
loop L9
;输出排序结果
mov cl,0
mov bl,0
mov si,offset a1
L20:
mov ax,[si]
call output
cmp bl,7
je w3
mov dl,44
mov ah,2
int 21h
inc bl
w3:
add si,2
inc cl
cmp cl,8
jb L20
MOV AH,4CH
INT 21H
;输出字符串
stoutput proc;入口参数si
push ax
push dx
L0:
mov al,[si]
cmp al,'$'
je over
mov dl,al
mov ah,2
int 21h
inc si
jmp L0
over:pop dx
pop ax
ret
stoutput endp
;输出回车
enters proc
push ax
push dx
mov dl,13
mov ah,2
int 21h
mov dl,10
mov ah,2
int 21h
pop dx
pop ax
ret
enters endp
;输入整数
input proc;出口bx
push cx
push ax
mov cl,10
mov bx,0
again:
mov ah,1
int 21h
cmp al,'0'
jb over1
cmp al,'9'
ja over1
sub al,48
mov ah,0
xchg bx,ax
mul cl
add bx,ax
jmp again
over1:
pop ax
pop cx
ret
input endp
;输出整数
output proc;ax入口
push bx
push cx
push dx
mov cl,10
mov bl,0
L1:
div cl
push ax
add bl,1
mov ah,0
cmp ax,0
ja L1L2:
pop dx
mov dl,dh
add dl,48
mov ah,2
int 21h
sub bl,1
cmp bl,0
ja L2
pop dx
pop cx
pop bx
ret
output endp
sort proc
push dx
push bx
mov si,di
ONE:
add si,2
mov bx,a1[di]
cmp bx,a1[si]
ja TWO
jmp THREE
TWO:
MOV dx,a1[si]
mov a1[di],dx
mov a1[si],bx
THREE:
CMP SI,14
Jl ONE
pop bx
pop dx
ret
sort endp
CODES ENDS
END START
1.输入多位数用到 MUL乘
mul cl 默认al乘cl,需要初始化两个值,结果存放在ax中
2.输出多位数用到DIV除
div bl默认ax除bl 16位除8位,除数是8位,al放商,ah放余数
3.dup是重复次数 例如:a6 db 10 dup(?)代表重复十遍
4.offset取变量距离起始地址的偏移量
5.byte是字节类型 word是字类型
6.xchg交换;两个操作数
7.neg求反
8.and逻辑与指令
9.test测试指令
10.子程序用到的参数一定要压栈出栈,出口参数不压栈
11.I/O接口接口输入输出指令:IN/OUT
下一篇:Docker容器教程