汇编语言学习笔记

看完整本书之后,满脑子都是:必须完成这个实验,才能继续向下学习。

Posted by Elli0t on 2020-04-02

数据总线基础单位 bit (8根线就是2**8 bit)
地址总线基础单位 byte (因为地址总线所指向的一个储存单元就是 1 byte)

先执行器执行命令,再 ip 寄存器增加值。
入栈时,栈顶指针(sp)先增加,再填入数据;出栈时,栈顶指针(sp)先减少,再 pop 出来。
loop 中的指令运行一次后,CX 才会减一。
编程(edit)→ 编译(masm.exe)→ 连接(link.exe)→ 加载(command.exe 即 shell)→ 内存中的程序 → 运行(CPU)

内中断所引发的中断过程:

  1. 取内中断码 n
  2. 标志寄存器入栈,IF = 0,TF = 0
  3. CS、IP 入栈
  4. (IP)=(n*4),(CS)=(n*4+2)
  • 寄存器
    • CS:IP
    • DS:[bx+si+di+bp]
      • […]中,只有这4个寄存器可以用来进行内存单元的寻址。这4个寄存器可以单个出现,或只能以4种组合出现:bx 和 si、bx 和 di、bp 和 si、bp 和 di
      • dp 默认段地址在 SS 中
      • bx 默认段地址在 DS 中
    • SS:SP → stack 栈
    • CX → loop
    • flag 寄存器(标志寄存器)
      • pushf popf
      • ZF 结果为零 ZF = 1
      • PF 记录相关指令后,其结果的所有 bit 位中1的个数是否为偶数,如果是则为1
      • SF 结果为负 SF = 1
      • CF 无符号运算所代表的进位或者借位
      • OF 有符号运算代表的溢出
      • DF 为1则逆向传输,为0则正向传输。将 DS:si 的值符给 ES:di
      • IF = 0 禁止其他的可屏蔽中断
      • TF = 1 产生单步中断

reg : ax bx cx dx ah al bh bl ch cl dh dl sp bp si di
register的简写,表示寄存器
sreg : ds ss cs es
汇编语言 P-161
mem: memory的简写,表示内存单元

  • 汇编指令
    • db
      • db
      • dw
      • dd
    • dup ;dd 200 dup (0) 定义一个容量为200个字节的内存
    • div reg 或 div 内存单元 ;汇编语言 P-170,div byte ptr ds:[0],含义:(al)=(ax)/((ds)*16+0) 的商,(ah)=(ax)/((ds)*16+0)的余数
    • mul reg 或 mul 内存单元 ;汇编语言 p-199,两个向乘的数,要么都是8位,要么都是16位。
    • offset ;它的功能是取得标号的偏移地址 s:mov ax,offset s 相当于 mov ax,0
    • jmp
      • jmp short 标号
      • jmp near ptr 标号
      • jmp far ptr 标号
      • jmp 16位 reg ;jmp ax 在含义上好似 mov IP,ax
      • jmp word ptr [bx]
      • jmp dword ptr ds:[0] ;高地址处的字是转移的目的段地址,低地址处是转移的目的偏移地址
    • jcxz 标号 ;当 cx = 0时,转移到标号处执行
    • push pop 只能进行字操作
    • add 加一
      • adc 进位加
    • dec 减一
      • sbb 借位减
    • cmp 对比指令
      • je ;equal
      • jne
      • jb ;below
      • jnb
      • ja ;above
      • jna
    • in out
      • 只能使用 ax 或 al 来存放从端口中读入的数据或要发送到端口中的数据
    • cld 和 std
      • cld 将 df 设置为0,正向传输
      • std 将 df 设置为1,逆向传输
    • movsb 和 movsw
      • rep movsb 传输 byte 单位
      • rep movsw 传输 word 单位
    • shl 和 shr
      • shl 逻辑左移,shr 逻辑右移
    • sti 和 cli
      • sti,设置 IF=1
      • cli,设置 IF=0
    • leave 和 enter
      • Enter的作用相当:push ebp ; mov ebp,esp
      • Leave的作用相当:mov esp,ebp ; pop ebp
    • lea 和 mov
      • mov eax,[ebx+8]是把内存地址为ebx+8处的数据赋给eax
      • lea eax,[ebx+8]就是将ebx+8这个值直接赋给eax,而不是把ebx+8处的内存地址里的数据赋给eax
    • proc near 和 proc far
      • 如果你的子程序和主程序在同一个代码段,则使用near,调用发生后,主程序堆栈中只压入ip值
      • 如果你的子程序和主程序不在一个代码段,则使用far,调用发生后,主程序堆栈中将压入cs、ip值
    • nop:空指令。运行该指令时单片机什么都不做,但是会占用一个指令的时间。当指令间需要有延时(给外部设备足够的响应时间;或是软件的延时等),可以插入“NOP”指令。
参考链接

https://www.jianshu.com/p/d762644e076b
https://www.cnblogs.com/gkp307/p/9944684.html
标志寄存器