zoukankan      html  css  js  c++  java
  • 汇编入门之输入、输出、奇偶判断、多字节变量定义

    原创文章,转载请注明:汇编入门之输入、输入、奇偶判断、多字节变量定义  By Lucio.Yang

    1.入门参考

      首先介绍一个非常好的汇编知识的索引网站:经典汇编语言教程

      1.1 MOV CX,[BX]
        加方框的意思是说以BX中的数据为地址寻址,将寻址得到的数据放在CX中
      1.2 16位寄存器组
        4个数据寄存器(AX、BX、CX和DX)
        2个变址和指针寄存器(SI和DI) 2个指针寄存器(SP和BP)
        4个段寄存器(ES、CS、SS和DS)
        1个指令指针寄存器(IP)
        1个标志寄存器(Flags)
      1.3 DB
        定义字节变量的定义符为DB/BYTE(DefineByte),每个字节只占一个字节单元。
      1.4 INT 21H 指令说明
        参考:INT 21H 指令说明及使用方法

      1.5 无符号条件转移指令 

    JE/JZ

    ZF=1 Jump Equal or Jump Zero

    JNE/JNZ

    ZF=0 Jump Not Equal or Jump Not Zero

    JA/JNBE

    CF=0 and ZF=0 Jump Above or Jump Not Below or Equal

    JAE/JNB

    CF=0 Jump Above or Equal or Jump Not Below

    JB/JNAE

    CF=1 Jump Below or Jump Not Above or Equal

    JBE/JNA

    CF=1 or AF=1 Jump Below or Equal or Jump Not Above

    2.程序内容描述

      已知两个整数变量 A 和B,试编写完成下述操作的程序:
      (1)、若两个数中有一个是奇数,则将奇数存入A 中,偶数存入B 中。
      (2)、若两个数均为奇数,则两数分别加1,并存回原变量。
      (3)、若两个数均为偶数,则两变量不变。

    3.程序流程描述

      

    4.源代码

    DATAS SEGMENT
    Tip db 'Program run successfully',0ah,0dh,'$'
    Odd db ' is Odd',0ah,0dh,'$'
    Eve db ' is Even',0ah,0dh,'$'
    EntX db ' is x ',0ah,0dh,'$'
    Enty db ' is y ',0ah,0dh,'$'
    X db 6 dup(?);定义一个5个byte型的空间,内容用()内的数值填充,是?,不用初始化
    Y db 6 dup(?)
    DATAS ENDS
    
    STACKS SEGMENT
        ;此处输入堆栈段代码
    STACKS ENDS
    
    CODES SEGMENT
        ASSUME CS:CODES,DS:DATAS,SS:STACKS
    START:
        MOV AX,DATAS
        MOV DS,AX
        xor si,si;异或,将变址和指针寄存器清零
        xor di,di;第二个指针寄存器
        mov cx,5;将5移到cx中,cx控制循环次数
    INPUTX:
        mov ah,01h;键盘输入一个字符
        int 21h;键盘输入并且回显,,将ASCII送入AL中
        cmp al,'0'
        jb INPUTY;jump if below
        cmp al,'9'
        ja INPUTY;jump if above
        mov X[si],al;将输入字符移到n[0]
        inc si;加1指令
        jmp INPUTX
    INPUTY:
        mov ah,01h;键盘输入一个字符
        int 21h;键盘输入并且回显,将ASCII送入AL中
        cmp al,'0'
        jb JUDGEX;jump if below
        cmp al,'9'
        ja JUDGEX;jump if above
        mov Y[di],al;将输入字符移到n[0]
        inc di;加1指令
        jmp INPUTY
    JUDGEX:
        mov X[si],'$'
        dec si;减1指令
        xor ah,ah;ah清空
        mov al,X[si];si指向低位
        mov bl,2
        div bl;除法指令(ax/2),被除数默认存放在AX
        cmp ah,0;无符号比较,ZF=1表示两个数相等
        jnz XO;ZF=0,即余数不等于0等于1,为奇数
         jz XE
    XO:
        ;输出X
        mov dx,offset X
        call OUTPUT
        ;输出奇数字符串
        mov dx,offset Odd;输出奇数字符串
        call OUTPUT  
        ;判断Y奇偶
        mov Y[di],'$'
        dec di;减1指令
        xor ah,ah;ah清空
        mov al,Y[di];si指向低位
        mov bl,2
        div bl;除法指令(ax/2),被除数默认存放在AX
        cmp ah,0;无符号比较,ZF=1表示两个数相等
        jnz OO;ZF=1,即余数不等于0等于1,为奇数
        jz OE
    XE:
        ;输出X
        mov dx,offset X;取1的偏移地址给dx
        call OUTPUT
        ;输出偶数字符串
        mov dx,offset Eve
        mov ah,09h
        int 21h
        ;判断Y奇偶
        mov Y[di],'$'
        dec di;减1指令
        xor ah,ah;ah清空
        mov al,Y[di];di指向低位
        mov bl,2
        div bl;除法指令(ax/2),被除数默认存放在AX
        cmp ah,0;无符号比较,ZF=1表示两个数相等
        jnz EO;ZF=1,即余数不等于0等于1,为奇数
        jz EE
    OO:
        ;输出Y
        mov dx,offset Y
        call OUTPUT
        ;输出奇数字符串
        mov dx,offset Odd;输出奇数字符串
        call OUTPUT
        
        inc X[si]
        inc Y[di]
        jmp EXIT
    OE:
        ;输出Y
        mov dx,offset Y;取1的偏移地址给dx
        call OUTPUT
        ;输出偶数字符串
        mov dx,offset Eve
        call OUTPUT
        jmp EXIT
    EE:
        ;输出Y
        mov dx,offset Y;取1的偏移地址给dx
        call OUTPUT
        ;输出偶数字符串
        mov dx,offset Eve
        call OUTPUT
        jmp EXIT
    EO:
        ;输出Y
        mov dx,offset Y
        call OUTPUT
        ;输出奇数字符串
        mov dx,offset Odd;输出奇数字符串
        call OUTPUT
        
           mov al,X[0]
           mov ah,Y[0]
           xchg ah,X[0]
           xchg al,Y[0]
           
           mov al,X[1]
           mov ah,Y[1]
           xchg ah,X[1]
           xchg al,Y[1]
           
           mov al,X[2]
           mov ah,Y[2]
           xchg ah,X[2]
           xchg al,Y[2]
           
           mov al,X[3]
           mov ah,Y[3]
           xchg ah,X[3]
           xchg al,Y[3]
           
           mov al,X[4]
           mov ah,Y[4]
           xchg ah,X[4]
           xchg al,Y[4]
           
           mov al,X[5]
           mov ah,Y[5]
           xchg ah,X[5]
           xchg al,Y[5]
        
        jmp EXIT
    EXIT:    
        xor si,si
        xor di,di
        ;输出最后结果
        mov dx,offset X
        call OUTPUT
        mov dx,offset Entx
        call OUTPUT
        mov dx,offset Y
        call OUTPUT
        mov dx,offset Enty
        call OUTPUT
        
        dec cx
        jmp INPUTX;loop INPUTX
        
        mov ah,00h;暂停
        int 16h
        MOV AH,4CH;结束,返回DOS
        INT 21H
    OUTPUT proc
        mov ah,09h
        int 21h
        ret
    OUTPUT endp
    CODES ENDS
        END START
    View Code
  • 相关阅读:
    Pandas 学习记录(一)
    python 列表常用操作
    pandas 基本操作
    Numpy np.array 相关常用操作学习笔记
    JS控制背景音乐 没有界面
    Linux Awk使用案例总结
    Yii2 定时任务创建(Console 任务)
    YII2项目常用技能知识总结
    /etc/fstab readyonly 解决办法
    Redis 排行榜 自己简单练习
  • 原文地址:https://www.cnblogs.com/lucio_yz/p/4412942.html
Copyright © 2011-2022 走看看