实验1
https://blog.csdn.net/qq_16184125/article/details/72575458?
我这里先输入小写字母a,程序输出大写字母A,然后我再输入大写字母A,程序输出小写字母a
参考代码如下:
code segment
assume cs:code
start:
inchr: mov ah,1 ;输入字符
int 21h
cmp al,13 ;如果是回车则结束
je exit
cmp al,30h ;如果小于30('0'),则为非法输入
jl exit
cmp al,39h ;如果输入为数字,则直接输出
jle outnum
cmp al,41h
jl exit
cmp al,5Ah ;输入为大写字母,则跳转
jle outs
cmp al,61h
jl exit
cmp al,7Ah ;输入为小写则跳转
jle outl
outnum: sub al,30h
mov dl,al ;将数字存入dl用于输出
mov ah,2
int 21h
jmp inchr
outs: add al,20h ;将输入的大写字母加上20h转成小写字母
mov dl,al
mov ah,2
int 21h
jmp inchr
outl: sub al,20h ;同理,将小写字母减去20h转成大写字母
mov dl,al
mov ah,2
int 21h
jmp inchr
exit: mov ah,4ch
int 21h
code ends
end start
实验2
https://www.omegaxyz.com/2017/05/26/assemblyexperiment6_2/
程序运行结果如下图所示
参考代码:
DATAS SEGMENT
array dw 1,2,3,-4,5,-6,7,-8
DATAS ENDS
ext segment
pdata dw 8 dup(?)
ndata dw 8 dup(?)
a db 30h
b db 30h
ext ends
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,es:ext
START:
MOV AX,DATAS
MOV DS,AX
mov ax,ext
mov es,ax
lea bx,array
lea si,pdata
lea di,ndata
mov cx,8
T: mov ax,[bx]
test ax,8000h
jz P
mov es:[di],ax
add a,1
add di,2
jmp L
P: mov es:[si],ax
add b,1
add si,2
L:add bx,2
loop T
mov dl, a
mov ah,2
int 21h
mov dl,20h
mov ah,2
int 21h
mov dl, b
mov ah,2
int 21h
MOV AH,4CH
INT 21H
CODES ENDS
end start
实验3
参考代码
data segment
PTABLE dw p1,p2,p3,p4,p5,p6,p7,p8 ;定义分支地址表
data ends
code segment
assume cs:code,ds:data
start:
mov ax,data
mov ds,ax
mov ah,7 ;输入数字(无回显)
int 21h
cmp al,31h ;判断输入是否合法
jl exit
cmp al,38h
jg exit
mov dl,al ;将输入存入dl,当做提示指令输出
mov bl,al
sub bl,31h ;将ascii码转为数值
shl bl,1 ;此操作将bl乘2,用于指向地址表中的地址(0,2,4,6,8,a,c,e)
jmp PTABLE[bx] ;根据地址转向对应分支
p1: mov ah,2 ;显示输入的数字,下同
int 21h
jmp exit
p2: mov ah,2
int 21h
jmp exit
p3: mov ah,2
int 21h
jmp exit
p4: mov ah,2
int 21h
jmp exit
p5: mov ah,2
int 21h
jmp exit
p6: mov ah,2
int 21h
jmp exit
p7: mov ah,2
int 21h
jmp exit
p8: mov ah,2
int 21h
jmp exit
exit: mov ah,4ch ;程序结束
int 21h
code ends
end start
运行结果如下
444