Fork me on Gitee

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

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

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

posted @ 2019-11-09 23:23  ---dgw博客  阅读(425)  评论(0编辑  收藏  举报