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

 

汇编四(8086/16位)最具价值的参考题目解析_大小写

 

2:  运算

实现下列公式计算(假设 X = 4、Y = 5)。

 

汇编四(8086/16位)最具价值的参考题目解析_大小写_02

 

 

 

 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,分别作判断和计算。

汇编四(8086/16位)最具价值的参考题目解析_斐波那契数列_03

 注意: 使用简化段 不知道为什么在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

汇编四(8086/16位)最具价值的参考题目解析_斐波那契数列_04

 

 

 

存在问题

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 栈操作