汇编四(8086/16位)最具价值的参考题目解析
原创
©著作权归作者所有:来自51CTO博客作者信息所话事人的原创作品,请联系作者获取转载授权,否则将追究法律责任
1: 汇编语言实现斐波那契数列
DATAS SEGMENT
arr DW 101H DUP(0001,0001); 初始化
DATAS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS
START:
MOV AX,DATAS
MOV DS,AX
MOV CX,100
MOV SI,0
XOR AX,AX
XOR BX,BX
next:
ADD DX,arr[SI]
ADD SI,2H ; 定义为字移动一位为2
ADD DX,arr[SI]
ADD SI,2H ; 定义为字移动一位为2
MOV arr[SI],DX
SUB SI,2H
XOR DX,DX ;DX归零
LOOP next
MOV AH,4CH
INT 21H
CODES ENDS
END START
2: 运算
实现下列公式计算(假设 X = 4、Y = 5)。
IMUL IDIV指令 : 源操作数都是AX
.model small ;
.data ;
x db 3
y db 2
.code ;
start:
mov ax,@data
mov ds,ax
mov al,x
add al,y
mov bl,8
imul bl ;al*bl>ax
sub ax,x;
mov bl,2
idiv bl
mov ah,4ch
int 21h
end start
设计分支程序,实现下列公式计算。X、Y 为字型。假设 X 单元中保存三个数:9,-6,34,分别作判断和计算。
注意: 使用简化段 不知道为什么在MASM调试看不到输出信息
.model small
.stack
.data
x dw 9,-6,34;
y dw 3 dup(?)
.code
start:
mov ax,@data
mov ds,ax
xor si,si
mov cx,3 ; loop is 3
let0:mov ax,x[si]
cmp ax,0
jge let1 ;>=0
imul ax
jmp out
let1:
cmp ax,10
JGE let2 >=10
sal ax,1
add ax,3
jmp out
let2:
mov bx,0006h
idiv bx
jmp out
out:
mov y[si],ax
inc si
inc si
dec cx
cmp cx,0
jnz let0
mov ah,4ch
int 21h
end start
3 字母大小写
汇编判断字母大小写
.model small
.stack
.data
x dw 'A','z','0','s'
.code
start:
mov ax,@data
mov ds,ax
mov si,0
mov di,4; //loop 4
mov cx,0
let0:
mov ax,x[si]
test ax,40h;判断数字
jz let1
test ax,20h;判断字母大小写
jz let2
inc cx; ;处理小写 cx
jmp out
let2: ;处理大写 dx
inc dx
jmp out
let1: ;处理数字 bx表示数字个数
inc bx
jmp out
out:
inc si
inc si
dec di
cmp di,0
jnz let0
mov ah,4ch
int 21h
end start
对串进行大小写相互转换:
例: hellO worlD ===> HELLo WORLd
改正:
datas segment
x db 'HELLO$';
len dw $-x-1; 尾处理
datas ends
codes segment
assume cs:codes,ds:datas
start:
mov ax,datas
mov ds,ax
mov cx,len;
MOV si,0
MOV AX,0
next:
test x[si],20H
jz let0
AND x[si],0dfh ;转大写
jmp out
let0: ;转小写
or x[si],60H
jmp out
out:
add si,1;
loop next
mov dx,offset x
mov ah,09h
int 21h
mov ah,4ch
int 21h
codes ends
end start
存在问题
datas segment
x db 'hellOworlD','$'
len dw $-x;
datas ends
codes segment
assume cs:codes,ds:datas
start:
mov ax,datas
mov ds,ax
mov cx,len;
xor si,si
xor AX,AX
next:
mov AL,x[si]
cmp al,20H
jz let0
AND aL,11011111B ;转大写
mov x[si],ax
jmp out
let0: ;转小写
or al,01100001B
mov x[si],aL
jmp out
out:
add si,1;
loop next
mov x[si+1],'$'
mov dx,offset x
mov ah,09h
int 21h
mov ah,4ch
int 21h
codes ends
end start
4 栈操作