HHz的编程日记 - 汇编语言
type: channel
link: https://huanghaozi.com/index.php/tag/%E6%B1%87%E7%BC%96%E8%AF%AD%E8%A8%80/
items: 汇编语言寄存器重点笔记

汇编语言寄存器重点笔记
type: item
date: 2019-11-07T20:24:00+08:00
description: 通用寄存器8086CPU有14个寄存器，分别是AX、BX、CX、DX、SI、DI、SP、BP、IP、CS、SS、DS、ES、PSW 数据寄存器 AX：Accumulator 累加 BX：Base 基址 CX：Count 计数 DX：Data 数据 指针寄存器（Pointer——指针） SP：Stack 堆栈指针 BP：Base 基指针 变址寄存器（Index——索引） SI：Source 源变址 DI：Destination 目的变址 控制寄存器（控制指令） IP：Instruction Pointer 指令指针（指令不可直接访问，控制指令执行位置） FLAG：标志寄存器 段寄存器（Segment） CS：Code 代码段——从中可读出放代码的地方在哪 DS：Data 数据段——从中可读出放数据的地方在哪 SS：Stack 堆栈段——从中可读出放堆栈的地方在哪 ES：Extra 附加段——从中可读出附加段的地方在哪零散芝士 十六进制表示：0x开头或H结尾 []表示取括号内地址处的值，这里的地址是偏移地址 L低位，H高位，16位cpu内部的寄存器可通过高低位支持8位程序，比如可以用AL、AH这样表示8位寄存器 段地址就是这个段开头所在的地址，偏移地址就是从开头向后偏移多少的位置 段地址 + 偏移地址拼起来 = 物理地址，具体计算就是段地址左移4位再加上偏移地址，也就是段地址乘16 程序执行的时候，程序段所在的地址存在CS（代码段寄存器）里，偏移地址存在IP里，表示程序运行到哪句，IP里的值会自动增加，让语句一条一条执行 几条汇编指令MOVMOV ax,18 ;将18写进ax寄存器ADDADD ax,18 ;将18加到ax寄存器ADDADD ax,18 ;将ax寄存器里的东西减掉18JMPJMP 2AE3:0003 ;跳转到段地址2AE3，偏移地址0003处取出语句执行 ;JMP会更改CS寄存器和IP寄存器的值以达到跳转的目的栈SS（Stack Segment）SS是存放这个堆栈段所在的地址的一个段寄存器，表示的是栈顶注意，不可直接把数据写入SS这个寄存器！只能用其他寄存器（如ax）中转！;示例： ;正确写法 MOV ax,1000H MOV ss,ax ;错误写法 MOV ss,1000HSP（Stack Pointer）SP是这个栈内游标所在的位置，从栈底下面一个单元开始，随着元素push进来向栈顶方向走 注：栈为空的时候，SP指针指向的是栈底下面的单元，在PUSH指令作用后，SP指针将上移一个单元通过对SS和SP赋值，可确定栈顶和栈底所在的地址，由此确定一个栈由此可推理出，给SP赋予的初始值实际上是整个栈的大小，比如要用16个字节，10000H~1000FH里面定义一个栈，也就是1000里的 0~F，那么SS就要赋值1000H，SP就赋值16字节，也就是0010HPUSHPUSH 16 ;将16入栈 PUSH ax ;将ax里的数据入栈POPPOP ax ;出一个栈顶元素，放进ax里综合示例mov ax,0056H ;栈顶在0056H处 mov ss,ax mov sp, 0080H ;16*8=128字节