zoukankan      html  css  js  c++  java
  • 汇编四(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 栈操作

  • 相关阅读:
    今年的第几天?
    特殊乘法
    abc
    求最大最小数
    二叉树遍历
    球的半径和体积
    成绩排序
    OC学习篇之---类的定义
    OC学习篇之---第一个程序HelloWorld
    OC学习篇之---类的初始化方法和点语法的使用
  • 原文地址:https://www.cnblogs.com/dgwblog/p/11828491.html
Copyright © 2011-2022 走看看