寒假学习笔记1.15

一、 扩展指令集实现

  1. 算术运算扩展
    减法指令(SUB)
    python
    def sub(reg, source):
    """减法运算:reg = reg - source"""
    if source in REGISTERS:
    value = REGISTERS[source]
    elif source.isdigit():
    value = int(source)
    else:
    raise ValueError("无效源操作数")

    设置标志位

    FLAGS['CF'] = 1 if value > REGISTERS[reg] else 0 # 借位标志
    FLAGS['ZF'] = 1 if REGISTERS[reg] - value == 0 else 0 # 零标志

    REGISTERS[reg] -= value
    乘法指令(MUL)和除法指令(DIV)
    python
    def mul(reg, source):
    """乘法运算:reg = reg * source"""
    if source in REGISTERS:
    value = REGISTERS[source]
    elif source.isdigit():
    value = int(source)
    REGISTERS[reg] *= value

def div(reg, source):
"""除法运算:reg = reg // source"""
if source in REGISTERS:
value = REGISTERS[source]
elif source.isdigit():
value = int(source)
if value == 0:
raise ValueError("除零错误")
REGISTERS[reg] //= value
2. 逻辑运算指令
与运算(AND)、或运算(OR)、非运算(NOT)
python
def and_op(reg, source):
"""按位与运算"""
if source in REGISTERS:
value = REGISTERS[source]
elif source.isdigit():
value = int(source)
REGISTERS[reg] &= value
FLAGS['ZF'] = 1 if REGISTERS[reg] == 0 else 0

def or_op(reg, source):
"""按位或运算"""
if source in REGISTERS:
value = REGISTERS[source]
elif source.isdigit():
value = int(source)
REGISTERS[reg] |= value
FLAGS['ZF'] = 1 if REGISTERS[reg] == 0 else 0

def not_op(reg):
"""按位非运算"""
REGISTERS[reg] = ~REGISTERS[reg]
二、 栈机制实现

  1. 栈内存分配
    python

扩展内存模型,分配栈空间

MEMORY_SIZE = 256
STACK_SIZE = 64
MEMORY = [0] * MEMORY_SIZE # 0-191为通用内存,192-255为栈空间

栈指针寄存器

REGISTERS['SP'] = MEMORY_SIZE - 1 # 栈指针指向栈顶
REGISTERS['BP'] = MEMORY_SIZE - 1 # 基址指针
2. 栈操作指令
PUSH(压栈)
python
def push(source):
"""将数据压入栈"""
if source in REGISTERS:
value = REGISTERS[source]
elif source.isdigit():
value = int(source)

# 栈从高地址向低地址增长
MEMORY[REGISTERS['SP']] = value
REGISTERS['SP'] -= 1# 栈溢出检查
if REGISTERS['SP'] < MEMORY_SIZE - STACK_SIZE:raise MemoryError("栈溢出")

POP(出栈)
python
def pop(target):
"""从栈中弹出数据到目标寄存器"""
# 栈下溢检查
if REGISTERS['SP'] >= MEMORY_SIZE - 1:
raise MemoryError("栈下溢")

REGISTERS['SP'] += 1
value = MEMORY[REGISTERS['SP']]if target in REGISTERS:REGISTERS[target] = value
else:raise ValueError("目标必须是寄存器")

三、 子程序调用机制

  1. CALL和RET指令
    python
    def call(label):
    """调用子程序"""

    保存返回地址(下一条指令的地址)

    return_address = PC + 1
    push(str(return_address))

    跳转到子程序

    if label in LABELS:
    global PC
    PC = LABELS[label] - 1 # -1因为执行后会PC+1
    else:
    raise ValueError(f"未定义的标签: {label}")

def ret():
"""从子程序返回"""
# 从栈中弹出返回地址
pop('AX') # 临时存储到AX
global PC
PC = REGISTERS['AX'] - 1 # -1因为执行后会PC+1
2. 栈帧管理
python

进入子程序时保存基址指针并建立新栈帧

def enter():
"""进入子程序,建立新栈帧"""
push('BP') # 保存原BP
REGISTERS['BP'] = REGISTERS['SP'] # 新栈帧基址

def leave():
"""离开子程序,恢复原栈帧"""
REGISTERS['SP'] = REGISTERS['BP'] # 恢复栈指针
pop('BP') # 恢复原BP
四、 综合示例程序

  1. 计算阶乘的子程序
    python

汇编程序:计算5的阶乘

程序 = [
'MOV AX, 5', # 设置参数
'CALL FACTORIAL', # 调用阶乘函数
'MOV [0], AX', # 存储结果
'HLT', # 停机

# 阶乘子程序
'FACTORIAL:',
'PUSH BP',        # 保存原BP
'MOV BP, SP',     # 建立新栈帧
'PUSH BX',        # 保存BX'MOV BX, AX',     # 备份参数
'CMP AX, 1',      # 比较AX和1
'JLE BASE_CASE',  # 如果AX<=1,跳转到基本情况# 递归调用
'SUB AX, 1',      # AX = n-1
'CALL FACTORIAL', # 递归调用
'MUL AX, BX',     # AX = n * factorial(n-1)
'JMP END_FACT','BASE_CASE:',
'MOV AX, 1',      # factorial(1) = 1'END_FACT:',
'POP BX',         # 恢复BX
'POP BP',         # 恢复BP
'RET'             # 返回

]
2. 函数调用中的栈变化
text
初始状态:
SP=255, BP=255

执行CALL FACTORIAL后:
SP=254, MEMORY[255]=返回地址

执行PUSH BP后:
SP=253, MEMORY[254]=原BP值

执行MOV BP, SP后:
BP=253 (新栈帧基址)

执行PUSH BX后:
SP=252, MEMORY[253]=BX的原值

...递归调用会继续压栈...

每次RET返回时,会逆向恢复栈状态

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1179241.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

技術演講的光環:台上講得精彩,台下代碼一團糟

技術演講的光環&#xff1a;台上講得精彩&#xff0c;台下代碼一團糟引言&#xff1a;技術界的海市蜃樓在現代科技產業的舞台上&#xff0c;一種奇特現象日益普遍&#xff1a;那些在會議講台上口若懸河、演講精彩絕倫的技術專家&#xff0c;他們的實際編碼能力與台上表現往往形…

机器学习优化投资组合压力测试

机器学习优化投资组合压力测试 关键词:机器学习、投资组合、压力测试、优化、风险评估 摘要:本文聚焦于利用机器学习技术优化投资组合压力测试。首先介绍了投资组合压力测试的背景知识,包括其目的、适用读者以及文档结构。接着阐述了相关核心概念,如投资组合、压力测试和机…

AI架构师进阶:模型评估的5大核心方法

AI架构师进阶&#xff1a;模型评估的5大核心方法 一、引言&#xff1a;为什么模型评估是AI架构师的“生死局”&#xff1f; 1. 一个扎心的钩子&#xff1a;你踩过模型评估的“坑”吗&#xff1f; 去年&#xff0c;我遇到一位AI架构师朋友的求助&#xff1a;他带领团队花了3个月…

英语_阅读_Baidus robotaxi_待读

Baidus robotaxi (无人驾驶出租车) is experiencing an order increase in Wuhan, Hubei Province, which has been drawing public attention and leading to heated discussions. 百度的无人驾驶出租车正在湖北省武汉…

基于Comsol软件的激光熔覆熔池流动数值模拟:考虑马兰戈尼对流及元素影响下表面张力系数的转变研究

基于Comsol软件的激光熔覆熔池流动数值模拟&#xff0c;考虑马兰戈尼对流&#xff0c;表面张力&#xff0c;重力&#xff0c;浮力等熔池驱动力&#xff0c;并且考虑S活性元素&#xff0c;使得表面张力系数在某一温度由正向负的转变&#xff0c;即马兰戈尼对流方向的改变导致表面…

基于yolo26的番茄成熟度识别 西红柿成熟度检测数据集 农产品品质分级自动化算法 农业生产中果实成熟度批量检测 深度学习图像分割第10412期

番茄分割图像识别 目标检测数据集说明! 一、数据集核心信息表项目详情类别数量及中文名称3 类&#xff08;成熟、半成熟、未成熟&#xff09;数据总量2200 张图片数据集格式YOLO 格式核心应用价值1. 用于果实成熟度目标检测模型训练&#xff1b;2. 支撑农产品品质分级自动化算法…

一款自动化的403/401绕过测试工具

工具介绍 一款自动化的403/401绕过测试工具&#xff0c;集成了路径规范化、请求头注入及谓词篡改等多种实战技巧。工具使用 python run.py -u http://xx.comrun.py import requests import argparse import urllib3 from urllib.parse import urlparse# 忽略 SSL 警告 urllib3.…

费雪的行业领导者理论:寻找市场冠军

费雪的行业领导者理论&#xff1a;寻找市场冠军关键词&#xff1a;费雪的行业领导者理论、市场冠军、行业分析、企业评估、投资策略摘要&#xff1a;本文围绕费雪的行业领导者理论展开&#xff0c;旨在深入剖析该理论如何助力投资者寻找市场冠军。首先介绍了理论提出的背景、目…

IP反查工具,能够快速查询指定IP/域名关联的所有网站

工具介绍 ReverseIP-CN 是一款专为中文网络环境优化的IP反查工具&#xff0c;能够快速查询指定IP/域名关联的所有网站&#xff0c;是网络安全检测、资产梳理的利器。工具使用 依赖包安装&#xff1a; pip install -r requirements.txt参数说明&#xff1a; 参数 全称 说明-u --…

详细介绍:【杂谈】-边缘计算竞赛:人工智能硬件缘何超越云端

详细介绍:【杂谈】-边缘计算竞赛:人工智能硬件缘何超越云端pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Cons…

XSS 漏洞练习靶场,覆盖反射型、存储型、DOM 型、SVG、CSP、框架注入、协议绕过等多种场景

工具介绍 XSS-Sec 靶场项目是一个以“实战为导向”的 XSS 漏洞练习靶场&#xff0c;覆盖反射型、存储型、DOM 型、SVG、CSP、框架注入、协议绕过等多种场景。页面样式统一&#xff0c;逻辑清晰&#xff0c;适合系统化学习与教学演示。 关卡总览&#xff08;名称与简介&#xf…

学长亲荐10个AI论文写作软件,MBA论文轻松搞定!

学长亲荐10个AI论文写作软件&#xff0c;MBA论文轻松搞定&#xff01; AI工具如何让论文写作不再“难” 在MBA学习过程中&#xff0c;论文写作往往是许多学生最头疼的环节。无论是开题报告、研究设计&#xff0c;还是最终的论文撰写&#xff0c;都需要大量的时间与精力投入。而…

java求职学习day49

Mybatis任务三&#xff1a;加载策略及注解开发一 MyBatis加载策略 1.1 什么是延迟加载&#xff1f; 问题 通过前面的学习&#xff0c;我们已经掌握了Mybatis中一对一&#xff0c;一对多&#xff0c;多对多关系的配置及实现&#xff0c;可以实现 对象的关联查询。实际开发过程中…

ubuntu 实现远程登录

ubuntu 实现远程登录一、创建用户sudo useradd -m jane二. 创建用户的主目录 adduser命令默认会为新用户创建一个主目录,例如/home/jane。 三. 设置文件权限 更改文件所有者 你可以使用chown命令来更改文件或目录的所…

挖掘 0-Day 漏洞:AFL++ 模糊测试实战,给开源图像库 (libpng) 找一个致命 Crash

标签&#xff1a; #Fuzzing #AFL #Security #VulnerabilityResearch #0Day #ASAN ⚠️ 免责声明&#xff1a;本文仅供安全研究与教学使用。请勿对未授权的商业软件或网络进行攻击。&#x1f9ec; 前言&#xff1a;什么是覆盖率导向的 Fuzzing&#xff1f; 传统的 Fuzzing 是“瞎…

AI领域技术进展速览:从模型更新到硬件竞争

LWiAI播客 #224 - OpenAI转向盈利&#xff01;Cursor 2、Minimax M2、Udio版权问题 这是我们第224期节目&#xff0c;总结和讨论上周的重要人工智能新闻&#xff01; 录制于2025年10月31日 本期内容&#xff1a; OpenAI完成了其盈利性重组&#xff0c;重新定义了与某中心的合作…

Codeforces Round 1073 Div1 + Div2 部分题目题解

比赛传送门:Codeforces Round 1073。 打的 Div2。AB 赛时切了。 C 题解 设 \(s\) 升序排序后为 \(t\),那么如果 \(s=t\) 显然 Bob 胜利,否则我们断言 Alice 一定胜利。 如果 Alice 可以一步将 \(s\) 变成 \(t\),那…

布隆过滤器进阶:布谷鸟过滤器 (Cuckoo Filter) 是如何支持“删除”操作的?

标签&#xff1a; #Algorithm #BloomFilter #CuckooFilter #DataStructure #SystemDesign&#x1f6ab; 前言&#xff1a;布隆过滤器的“死穴” 布隆过滤器的原理是将一个元素通过 个哈希函数映射到位数组的 个点上。 为什么不能删&#xff1f; 假设元素 A 映射到了位置 [1, …

web入门111-120

web111 分析代码v1必须等于ctfshow,v2使用全局变量 ?v1=ctfshow&v2=GLOBALSweb112 分析代码使用伪协议 ?file=php://filter/resource=flag.phpweb113 分析代码使用zlib:// 伪协议 ?file=compress.zlib://flag.p…

第 485 场周赛Q1——3813. 元音辅音得分

题目链接&#xff1a;3813. 元音辅音得分&#xff08;简单&#xff09; 算法原理&#xff1a; 解法&#xff1a;模拟 1ms击败100.00% 时间复杂度O(N) 其实题目中要求的向下取整就是默认的 / 就可以&#xff0c;所以我们只需要按要求统计出对应的 v、c 然后按照题目要求返回…