当前位置: 首页 > news >正文

接口技术##汇编语言

例1 
DATA SEGMENT
    BLOCK DW 0ABCDH    ;字型变量BLOCK,赋值0ABCDH
    BUFF  DD ?         ;从BUFF偏移地址开始,为一个双字型数据保留了4个字节的内存单元
DATA ENDS

CODE SEGMENT
          ASSUME CS:CODE,DS:DATA
    START:
          MOV    AX,DATA            ;AX寄存器储存DATA首地址
          MOV    DS,AX              ;段寄存器DS储存DATA首地址
          MOV    DX,BLOCK           ;DX储存变量BLOCK DX是ABCDH
          MOV    AX,DX              ;AX储存ABCDH
          AND    AX,0F0FH           ;与运算,AX储存0B0DH
          AND    DX,0F0F0H          ;DX储存A0C0H
          MOV    CL,4               ;CX计数器的地位储存4
          SHR    DX,CL              ;DX逻辑右移4位 空位补0 DX储存0A0CH
          LEA    BX,BUFF            ;加载变量BUFF的首地址 到BX-双字型4字节
          MOV    [BX+0],AL          ;AX低8位-1字节 0DH
          MOV    [BX+1],DL          ;DX低8位-1字节 OCH
          MOV    [BX+2],AH          ;AX高8位       0BH
          MOV    [BX+3],DH          ;DX高8位       0AH

          MOV    AX,4C00H           ;中断进入系统调动  DOS功能
          INT    21H
CODE ENDS
    END START    
    
例2 判断MEMS单元数据,将结果存入MEMD单元。若数据>0,结果为1;若数据<0,结果为-1;若数据=0,结果为0. 
DATA SEGMENT
    MEMS DB 08H                     ;字节型变量MEMS
    MEMD DB ?                       ;字节型变量MEMD
DATA ENDS

CODE SEGMENT
          ASSUME DS:DATA,CS:CODE
    START:
          MOV    AX,DATA   
          MOV    DS,AX
          MOV    AL,MEMS            ;取数据判断 AL=0BH--1个字节
          CMP    AL,0               ;AL和0比较
          JGE    NEXT               ;大于等于0,跳到NEXT
          MOV    AL,-1              ;上边不符合,小于0时,-1存入AL
          JMP    DONE               ;跳到DONE

    NEXT: 
          JE     DONE               ;等于0,跳转到DONE
          MOV    AL,1               ;1存入AL

    DONE: 
          MOV    MEMD,AL            ;AL存入MEMD

          MOV    AX,4C00H           ;DOS功能号
          INT    21H
CODE ENDS
    END START
 例3 统计BUFF缓冲区数据中负数的个数.
DATA SEGMENT
    BUFF DB 67H,9EH,-6AH,0ABH,6DH    ;
    MEM  DB ?
DATA ENDS

CODE SEGMENT
          ASSUME CS:CODE,DS:DATA
    START:
          MOV    AX,DATA
          MOV    DS,AX
          MOV    CX,5             ;控制循环次数--数字的总个数
          LEA    BX,BUFF          ;设置缓冲区指针
          MOV    DL,0             ;统计计数器清零--统计负数的个数

    NEXT: 
          MOV    AL,[BX]          ;取出第一个数据放在AL--67H
          CMP    AL,0             ;作比较
          JNS    AA1              ;不是负数,转移到AA1
          INC    DL               ;负数,统计值+1

    AA1:  
          INC    BX               ;因为字节+1 移动指针
          LOOP   NEXT             ;循环

          MOV    MEM,DL           ;负数个数存在MEM         
    
          MOV    AX,4C00H
          INT    21H
CODE ENDS
END START


例4 统计AX寄存器中‘1’的个数
CODE SEGMENT
          ASSUME CS:CODE
    START:
          MOV    CX,16       ;循环次数16 --AX寄存器存16位
          XOR    DL,DL       ;清零
          CMP    AX,0        ;AX是0吗
          JZ     DONE        ;是0,16位没有数字1,结束循环

    BB1:  
          SHL    AX,1        ;不是0,逻辑左移1位,移出的位置放在CF
          ADC    DL,0        ;统计‘1’个数  ADC=ADD+CF
          LOOP   BB1
        
    DONE: 
          MOV    AX,4C00H
          INT    21H
CODE ENDS
    END START
 例5 在BLOCK内存区中有一串字符,统计‘%’之前的字符个数
DATA SEGMENT
    BLOCK DB    'ANDEP01395WR'
    COUNT ENQ $-BLOCK            ;当前位置对应偏移地址  统计字符串8位数据长度
    MEM   DB    0
DATA ENDS

CODE SEGMENT
          ASSUME CS:CODE,DS:DATA
    START:
          MOV    AX,DATA
          MOV    DS,AX
          MOV    SI,OFFSET BLOCK    ;相当于LEA SI,BLOCK
          MOV    CX,COUNT           ;次数放在COUNT中
    LOOP1:
          MOV    AL,[SI]            ;取字符
          CMP    AL,'%'             
          JZ     DONE               ;是‘%’  结束循环
          INC    BYTE PTR MEM       ;不是‘%’ 统计值+1
          INC    SI                 ;指针+1
          LOOP   LOOP1
    DONE: 
          MOV    AX,4C00H
          INT    21H
CODE ENDS
    END START
 例6 用子程序结构实现寄存器AX内容乘10,结果仍在AX中.

CCC EQU 1000
CODE SEGMENT
          ASSUME CS:CODE
    START:
          MOV    AX,CCC     ;AX赋值为1000 十六进制03E8H
          CALL   MUL10      ;调用子程序

    ;子程序
MUL10 PROC                  ;乘10子程序  入口参数AX,出口参数AX
          PUSHF             ;保护现场   保护标志寄存器和BX
          PUSH   BX
    ;10*AX->AX
          ADD    AX,AX      ;2XX->AX
          MOV    BX,AX      ;2XX->BX
          ADD    AX,AX      ;4XX->AX
          ADD    AX,AX      ;8XX->AX
          ADD    AX,BX      ;8XX+2XX->AX

          POP    BX         ;恢复现场
          POPF
          RET               ;返回主程序
MUL10 ENDP

CODE ENDS
    END START
    

相关文章:

  • QSplitter保存和读取
  • [数据结构]栈和队列
  • C++20 DR11:数组 `new` 可以推导出数组大小
  • VS Code连接服务器教程
  • C/C++类型转换
  • 扎实基础:测试工作的基石
  • Flask 框架简介
  • Manus+Ollama实现本地大模型部署和应用测试
  • 基于multisim的花样彩灯循环控制电路设计与仿真
  • 密码学(终极版)
  • Django系列教程(5)——Django模型详解
  • 物联网设备接入系统后如何查看硬件实时数据?
  • 【摸鱼指南】--- VSCode 使用 Thief-Book 隐形阅读模式配置教程 程序员必备插件
  • 子集(78)
  • Docker 深入解析 Docker 配置文件:/etc/docker/daemon.json
  • 操作系统——进程与线程
  • 用CMake编译glfw进行OpenGL配置,在Visual Studio上运行
  • python爬虫系列课程8:js浏览器window对象属性
  • K8s构建带有maven环境的jenkins镜像
  • Fragment 懒加载的优化方案
  • 青岛做网站的好公司/百度关键词排名批量查询工具
  • 云龙微网站开发/网站测试报告
  • 15 企业网站优化方案有哪些内容/seo职位具体做什么
  • 企业网站的建设包括哪些/seo资讯
  • 中山网站制作专业/百度人工服务热线电话
  • as3 xml 网站模板 下载/免费信息发布平台网站