首页 > 编程语言 >8086 汇编学习 Part 6

8086 汇编学习 Part 6

时间:2024-05-03 18:55:25浏览次数:65  
标签:标号 汇编 8086 16 IP SP Part CALL 指令

用 MUL 指令做乘法

格式

  • MUL 寄存器
  • MUL 寄存单元
8 位乘法 16 位乘法
被乘数(默认) AL AX
乘数 8 位寄存器或内存单元 16 位寄存器或内存字单元
结果 AX DX (高位) 和 AX (低位)

模块化程序设计

  • 调用子程序 : CALL 指令
  • 返回 : RET 指令

实质

流程转移指令,它们都修改 IP ,或同时修改 CS 和 IP

CALL 指令

字面意思

调用子程序

实质

  • 流程转移
  • CALL 指令实现转移的方法和 JMP 指令的原理相似

格式

CALL 标号

  • 16 位位移 = “标号”处的地址 - CALL 指令后的第一个字节的地址
  • 16 位位移的范围为 \([-32768,32767]\) ,用补码表示
  • 16 位位移由编译程序在编译时算出。

CPU 执行 CALL 指令的流程

  1. 将当前 IP 或 CS 和 IP 压入栈中
  2. 转移到标号处执行指令

CPU 执行 CALL 指令的原理

  1. (SP) = (SP) - 2 ((SS) * 16 + (SP)) = (IP)
  2. (IP) = (IP) + 16 位位移
    相当于 PUSH IPJMP NEAR PTR 标号

CALL FAR PTR 标号 实现的是段间转移

CPU 执行 CALL FAR PTR 标号 时的操作

(SP) = (SP) - 2
((SS) * 16 + (SP)) = (CS)
(SP) = (SP) - 2
((SS) * 16 + (SP)) = (IP)
  1. (CS) = 标号所在的段地址 (IP) = 标号所在的偏移地址
    CALL FAR PTR 标号 相当于
PUSH CS
PUSH IP
JMP FAR PTR 标号

转移地址在寄存器中的 CALL 指令

指令格式

CALL 16位寄存器

功能

(SP) = (SP) - 2
((SS)*16+(SP)) = (IP)
(IP) = (16位寄存器)

相当于进行

PUSH IP
JMP 16位寄存器

转移地址在内存中的 CALL 指令

  1. CALL WORD PTR 内存单元地址
    相当于 :PUSH IPJMP WORD PTR 内存单元地址
  2. CALL DWORD PTR 内存单元地址
    相当于 :PUSH CSPUSH IPJMP DWORD PTR 内存单元地址

返回指令 RET 和 RETF

RET 指令 RETF 指令
功能 用栈中的数据,修改 IP 的内容,从而实现近转移 用栈中的数据,修改 CS 和 IP 的内容,从而实现远转移
相当于 POP IP POP IP POP CS

RET (字面值 n)

含义

POP IP
ADD SP,N

为 CALL 和 RET 指令设置栈

不定义栈段区时使用 CALL 和 RET 指令,使用的未经定义与分配的内存空间作为栈,代码很危险,所以一定要提前定义声明栈段区

子程序

根据提供的参数处理一定的事务,处理后,将结果(返回值) 提供给调用者。

寄存器来存储参数和结果是最常使用的方法

适用于参数返回值不多的情况下

内存单元批量传递数据

  • 将批量数据放到内存中,然后将它们所在内存空间的首地址放在寄存器中,传递给需要的子程序
  • 对于具有批量数据的返回结果,也可用同样的方法

批量传递参数

  • 由调用者将需要传递给子程序的参数压入栈中,子程序从栈中去的参数

标签:标号,汇编,8086,16,IP,SP,Part,CALL,指令
From: https://www.cnblogs.com/AlwaysBeShine/p/18171497

相关文章

  • M3位带地址映射和汇编对比
    01.位带概述位带操作简单的说,就是把每个比特膨胀为一个32位的字,当访问这些字的时候就达到了访问比特的目的,比如说GPIO的ODR寄存器有32个位,那么可以映射到32个地址上,我们去访问这32个地址就达到访问32个比特的目的。这样我们往某个地址写1就达到往对应比特位写1......
  • kafka核心概念Broker、Topic、Partition和Replication
    在Kafka中,Broker、Topic、Partition和Replication是四个核心概念,它们各自扮演了不同的角色并共同协作以确保数据的可靠性、可扩展性和高性能。以下是关于这四个概念的详细解释:Broker(代理)*Broker是Kafka集群中的一个节点,负责存储和转发消息。Kafka集群由多个Broker组成。*Brok......
  • 8086 汇编学习 Part 5
    流程转移背景一般情况下指令是顺序地逐条执行的,而在实际中,常需要改变程序的执行流程。转移指令可以控制CPU执行内存中某处代码的指令。可以修改IP,或同时修改CS和IP的指令。分类按转移行为分类段内转移:只修改IP(例如JMPAX)段间转移:同时修改CS和IP(例......
  • 统一场理论公式推导和笔记——part4
    三十二,核力场的定义方程所有的场都可以通过引力场变化而得到。核力场和电磁场一样也可以用引力场的变化来表示。==》这个就非常关键了,万有引力场【简称引力场】,回忆下定义:o点在空间点p处产生的引力场A【数量为a】:a=常数乘以Δn/Δs,A=-gkΔn(R/r)/Ωr² =-gkΔnR/Ω......
  • 41天【代码随想录算法训练营34期】第九章 动态规划part03 (● 343. 整数拆分 ● 96.
    343.整数拆分classSolution:defintegerBreak(self,n:int)->int:dp=[0]*(n+1)dp[2]=1foriinrange(3,n+1):forjinrange(1,i//2+1):dp[i]=max(dp[i],(i-j)*j,dp[i-j]*j)......
  • 39天【代码随想录算法训练营34期】第九章 动态规划part02(● 62.不同路径 ● 63. 不同
    62.不同路径classSolution:defuniquePaths(self,m:int,n:int)->int:table=[[0]*n]*mforxinrange(n):table[0][x]=1foryinrange(m):table[y][0]=1foryinrange(1,m):......
  • SystemVerilog -- 6.4 Interface ~ Clocking Block Part II
    SystemVerilogClockingBlockPartII时钟模块允许在指定的时钟事件对输入进行采样并驱动输出。如果提到时钟模块的输入skew,则该模块中的所有输入信号都将在时钟事件之前以skew时间单位进行采样。如果提到时钟模块的输出skew,则该模块中的输出信号都将在相应的时钟事件之后以ske......
  • 8086 汇编学习 Part 4
    寻址方式形式名称特点意义示例[idata]直接寻址用一个常量/立即数来表示地址用于直接定位一个内存单元MOVAX,[200][BX]寄存器间接寻址用一个变量来表示内存地址用于间接定位一个内存单元MOVAX,[BX][BX+idata]寄存器相对寻址用一个变量和常量......
  • 38天【代码随想录算法训练营34期】第九章 动态规划part01 (● 理论基础 ● 509. 斐波
    理论基础斐波那契数classSolution:deffib(self,n:int)->int:ifn==0:return0ifn==1:return1returnself.fib(n-1)+self.fib(n-2)爬楼梯classSolution:defclimbStairs(self,n:int)->i......
  • Windows平台NASM汇编与C混合调用
    Windows平台NASM汇编与C混合调用tonyblackwhite之前介绍了Windows平台下,用微软宏汇编MASM与C混合调用的方法。MASM是微软独有的,Linux没法用,我喜欢学一个能够应用于两种平台的,所以还是更钟情于开源的可跨平台的NASM汇编。tonyblackwhite:Win平台最简单的方式实现C程序调用汇编函......