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