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

汇编语言程序设计(二)十六位汇编框架、子程序与堆栈

寄存器

如下是16位通用寄存器,存储在cpu硬件中

AX 返回值

AX寄存器分为两部分 AH和AL

AH 高8位 存储功能号

AL 低8位 存储返回码

以下是一个AX寄存器应用:

mov ax,4c00h 4c给高位AL,00低位AL,16进制要以h结尾

BX

CX 计数器

DX

SI 目标寄存器

DI 源寄存器

SP 栈顶指针寄存器

BP 栈底指针寄存器

16位堆栈每单元占2字节

常见编译器指令

r 查看寄存器及下一行的指令

u 查看汇编代码

t 单步步入 遇见子程序进入内部 遇到int 21h指令时不要用t

p 单步步过 遇见子程序执行到子程序的下一行,忽略子程序的内部实现

g 运行

q 退出

d 读内存

d ss:fffe 0700 0007

常见汇编指令

MOV 数据传送指令 :

格式:MOV OPRD1,OPRD2 用处是将操作数2的值放到操作数1中

OPRD1指寄存器,内存

OPRD2指寄存器,内存,立即数即12345

内存(即变量)存储在内存中

以下是一个该指令应用例子:

MOV ax,1 将立即数1传入寄存器ax中

start  指定主程序起始位置

end start  指定主程序结束位置

proc  函数头

endp  函数尾

ret  函数返回:

在堆栈顶部取出返回地址,并且放置到IP寄存器

跳转到IP寄存器所在位置

jmp  无条件跳转指令:

jmp addr addr是地址,地址指哪跳转哪

call  子程序调用:

保存返回地址到堆栈

跳转到子程序中

int (中断指令):

最常见的中断指令 int 3,硬编码0xcc,称作软件中断

结束汇编程序需要DOS系统中int 21h指令,也叫21号中断,它具有很多功能。其中一个功能4C,

用来实现程序退出、并返回DOS。使用方法如下:

mov ah, 4ch

int 21h 此时中断程序

函数调用实现

参数:可以用内存,堆栈,寄存器传递参数

16位堆栈每单元占2字节,32位堆栈每单元占4字节,64位堆栈每单元占8字节

程序要时刻保持堆栈平衡

在传参时:

push 将一个值或者地址压入栈中,之后sp-2(如果是32位处理器-4)

pop 将一个值或者地址弹出栈中,之后sp+2(如果是32位处理器+4)

pop也可以换成add sp,2,意思是将栈屏掉2个字节,此时不需要管栈中的数据

返回值默认放在ax,eax,rax里

一个汇编程序

assume cs:code  code表示cs段的起始位置,cs段就是代码段

code segment  代码段开始

    setAx proc 函数开头

        push bp

        mov bp,sp

        mov si,[bp+4]

        mov di,[bp+6]  利用bp寻址

        mov ax,0ffffh 如果数据都是字母时, 开头0声明他是一个数字,h结尾表示他是一个十六进制数字

        pop bp

        ret 函数返回

    setAx endp 函数结束

start: 程序开始

    mov ax,4 

    mov bx,5

    push ax

    push bx  将寄存器中数据压入栈中

    call setAx  调用子程序即函数

    add sp,4  将栈屏掉4个字节用于平栈

    mov ax,1  将1放到ax寄存器保存

    mov bx,2

    mov ax,4c00h 将4c00传给ax寄存器

    int 21h  触发中断

code ends  代码段的结束位置

end start 结束程序


http://www.kler.cn/news/233651.html

相关文章:

  • 小周带你读论文-2之“草履虫都能看懂的Transformer老活儿新整“Attention is all you need(4)
  • 2024年-视觉AI检测的面试题目总结
  • 如何实现视线(目光)的检测与实时跟踪
  • 《CSS 简易速速上手小册》第5章:CSS 动画与过渡(2024 最新版)
  • 【社交电商】带直播电商功能,可以DIY前端,可以H5和小程序一般商城常用功能齐全
  • C++Linux网络编程day02:select模型
  • 基于完全二叉树实现线段树-- [爆竹声中一岁除,线段树下苦踌躇]
  • 风行智能电视G32Y 强制刷机升级方法,附刷机升级数据MstarUpgrade.bin
  • 【Java八股面试系列】并发编程-并发关键字,线程池
  • Leetcode 337 打家劫舍 III
  • 软件测试学习笔记-使用jmeter进行性能测试
  • ChatGPT高效提问—prompt常见用法(续篇四)
  • Acwing831KMP字符串
  • 【极数系列】Flink集成KafkaSink 实时输出数据(11)
  • 神经网络 | CNN 与 RNN——深度学习主力军
  • Redis篇之过期淘汰策略
  • springboot微信小程序 uniapp学习资料分享系统v9uy4
  • 【大厂AI课学习笔记】【1.5 AI技术领域】(8)文本分类
  • containerd中文翻译系列(二十一)用户命名空间
  • 一次显著的性能提升,从8s到0.7s
  • ClickHouse--02--安装
  • C++进阶(十三)异常
  • JAVA设计模式之代理模式详解
  • IDEA中Git的使用小技巧-Toolbar(工具栏)的设置
  • JVM 性能调优 - 常用的垃圾回收器(6)
  • MyBatisPlus之分页查询及Service接口运用
  • 【docker常见命令】
  • 【QT+QGIS跨平台编译】之三十一:【FreeXL+Qt跨平台编译】(一套代码、一套框架,跨平台编译)
  • 项目02《游戏-11-开发》Unity3D
  • Vue3.4+element-plus2.5 + Vite 搭建教程整理