汇编语言--小甲鱼

2023-10-13 22:40
文章标签 汇编语言 甲鱼

本文主要是介绍汇编语言--小甲鱼,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

[自用] 汇编语言–小甲鱼(全集)

部分笔记, 建议看b站的记笔记功能中记的,那个有时间节点。

第一个程序01 P20 - 05:59

过程:编译生成目标文件,链接目标文件生成可执行文件
在这里插入图片描述

可执行文件:程序和数据,描述信息
可执行文件内容

汇编源程序中指令分两种:

  • 汇编指令:有对应的机器码

  • 伪指令:给编译器看,没有对应的机器码

  1. segment ends

一对伪指令, 用来定义一个段

段名 segment 
...
段名 ends
  1. end

表示程序真正的没了,否则编译器不知道什么时候结束,注意和ends进行区分

  1. assume

假设,cs:ccc cs和ccc段关联,这样编译器会将ccc处理为一个地址,默认在cs段

在这里插入图片描述

源程序:源程序文件中的所有内容

程序:源程序中最终由计算机执行处理的指令或数据

第一个程序02 P21 - 00:13

标号:一个标号指代了一个地址, 比如 codesg

exe执行的过程: dos是一个单任务操作系统,cmd先暂停然后转给自己的文件.exe然后返回dos,称作程序的返回

两种错误: 语法错误 逻辑错误

第一个程序03 P22 - 00:20

操作系统都有一个 shell(外壳)程序.
在这里插入图片描述

常见debug命令

r # 查看寄存器的值,其中cx中存放的是程序的长度,比如cx=f,表示机器码有15个字节
rax  #修改寄存器的值,输入后会出现冒号,填写要修改为多少即可
u 13db:0  # 查看13db:0后边的20h个字节的机器代码反汇编
q # 表示退出
t # 单步执行,并观察结果
e # 改写内容
d # 地址查看
g # ip的偏移地址,可以直接跳转到这里
p # 相当于直接跳过循环

常见debug命令
debug r查看寄存器的值,其中cx中存放的是程序的长度,比如cx=f,表示机器码有15个字节

[BX]和loop指令01 P23 - 00:04

栈指针始终指向有数据的栈顶

mov ax,[0]在debug中表示将ds段的0为偏移地址的内容移到ax寄存器

而在编译器中表示将内容0移动到ax中

编译器中需要先把0放到bx中然后mov ax,[bx]

段寄存器,不能立即数mov

[BX]和loop指令02 P24 - 00:08

Loop指令实现: cx减1, 判断cx的值, 为0则继续执行, 否则跳转至标号处

cx开始默认存放程序的大小,直到将循环次数mov进去

[BX]和loop指令03 P25 - 00:23

mov cx要在标号上一行执行

汇编程序中,数据不能以字母开头,所以有的数字前边要加0

loop指令模板

mov cx count;count为循环次数
S: ...
loop S

[BX]和loop指令026 P26 - 00:49
没时间看复习课,,先跳过之后

[BX]和loop指令06 P28 - 05:39

在一船的PC机中·DOS方式下·DOS和其他台法的程序一般都不会使用0:200~0:2FF
( 0:200h-0:2FFh) 的256个字节的空间. 所以我们用这段空间是安全的.

[BX]和loop指令06 P28 - 10:34
又没时间看了先跳过

包含多个段的程序01 P29 - 00:06

dw定义字型数据,define word

start的意义,告诉程序从哪里开始,也就是说从哪里开始翻译机器码,而不是从一开始的数据就翻译

end除了通知编译器程序结束外,还通知编译器程序的入口在什么地方

我们所assume得data code stack段,cpu是不知道得,因为assume是伪指令,所以需要在start之后,通过指令设置ds,ss得值为data,stack,从而使得data变为真正意义上的数据段,ss成为整整意义上的栈段。至于真正得代码段,应该就是由start来确定把,否则默认为第一行?

包含多个段的程序03 P31 - 00:17

原来如此,这里自定义段名对应得地址间隔,取决于每个段存了多少数据,而段首地址总为16的倍数,指最终偏移1位后是16的倍数,所以当数据段只有1字节数据时候,栈段的地址是数据段地址+1,有x字节时候是,数据段地址+(x/16+1) 实际地址是段地址*16.

更灵活定位内存地址01 P32 - 01:03

and 与 可将对应位设为0

or 或 可将对应位设为1

以字符形式给出数据

单引号

大小写转换

a-A =32=20h

小写字母=大写字母+10 0000

这样就可以不通过判断是否为大小字母,直接都转换为大写或小写

更灵活定位内存地址02 P33 - 00:23

[bx+100]的意义是?

原来如此,妙啊

[bx+idata]的方式进行数组的处理

两个数组遍历时候,每遍历一个元素可以只改一次bx,而不是两次

[bx+5]=[5+bx]=5[bx]=[bx].5

5[bx]这种写法真的妙啊,就好像c语言中,一个在地址5处的数组名,的bx号元素

si和di

bx不够用所以引进的

source distination

更灵活定位内存地址04 P35 - 00:58

[idata]常量表示地址,debug时候可以直接用(debug指令与汇编没关系),masm时候必须加上ds:,不然不认,这也是之前说的为什么要用bx的原因

思想架在语言之上

为啥

数据处理的两个基本问题01 P38 - 00:02

总结以上三个视频:循环cx嵌套循环时候怎么办,进行下层循环时候先存cx到一个寄存器,执行上层循环时再取出来,但是寄存器不够用怎么办?内存,但是很多循环时候内存要以怎样的数据结构来存呢?栈!!!!!!太妙了,尽管学过栈,我也只想到新定义一个段用来存!!妙啊,直接push pop!这也是栈的由来。

寻址方式:

[]内可以填的bx si bp di,其中bx和bp地位相同,一个默认ds段,一个默认ss段(只有bp),

bx加 si或di

bp加 si或di

[idata]除非是0否则需要指明段地址

数据处理的两个基本问题02 P39 - 00:05

8.5数据多长?

比如word ptr ds:[0]

其他方法:默认制定了访问的是子单元还是字节,比如栈push pop 字操作

汇编对应的机器码中,存入的不是ip对应的绝对地址,而是偏移地址

???

转移指令的原理01 P43 - 22:42

s:mov ax,bx ip=0+2----->

mov bx,cx ip=ip+2

jmp s ip=ip+该指令长度(假如2)

mov dx,cx

缓冲器中执行 ip=ip+(jmp s中的偏移地址)-6这句话,这个偏移地址是由编译时候从绝对地址算出来的

ip变回为0

这也是负数的意义所在,用补码表示

short: 绝对位移如何变成相对的八位位移,由编译程序在编译时算出!!

jump near ptr: 段内转移 16位偏移 -32769——32767

转移指令的原理02 P44 - 02:21

jump far ptr:远转移,段间转移,!!不同段

里边不再是偏移地址了,而是绝对的目标地址

转移指令的原理02 P44 - 06:32

9.5

相当于jmp short/near,他们的操作数一直是目的地址,包括far,只不过机器码有的是偏移地址,有的是目的地址

以该内存单元地址中 存的word数据 作为目的地址 16位

32位

转移指令的原理03 P45 - 00:05

9.7 jcxz

所有的有条件跳转指令,都是短转移

写的最终地址,机器码依然是偏移地址

和jcxz刚好相反

而far是目标地址,在机器码中

便于封装调用

实验八、实验九详细讲解 P47 - 00:30

时间又来不及了有点,但是还是

实验八,运行为什么报错捏???jmp.asm

这个实验的核心是:跳转时候用的实际上是偏移地址

如果直接将一句跳转到s 的机器码(假如偏移-2)复制到另一行,那么程序运行并不会到s而是偏移-2

实验九:

Call和ret指令01 P48 - 01:11

时间关系时间关系,先跳一下,先学in out

端口01 P67 - 00:06

通过端口,cpu才能访问硬件

a是指要读写的数据,这里的d是指端口号

BIOS是英文"Basic Input Output System"的 缩略词 ,直译过来后中文名称就是"基本输入输出系统"。

. 70h 端口存入地址

71h 数据

shl :左移,补零,移出的一位放入cf

shl 左移位数大于1时候,只能mov al,cl,将要移动的位数放入 cl中,cf的值是最后移出的一位

shr :右移,补零,最后移出的一位写入cf

端口02 P68 - 00:05

可见一个字节两个bcd码 范围100

时隔200年没看,考试终究还是来了,继续吧

外中断01 P69 - 00:12

外中断信息

这篇关于汇编语言--小甲鱼的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/206333

相关文章

《x86汇编语言:从实模式到保护模式》视频来了

《x86汇编语言:从实模式到保护模式》视频来了 很多朋友留言,说我的专栏《x86汇编语言:从实模式到保护模式》写得很详细,还有的朋友希望我能写得更细,最好是覆盖全书的所有章节。 毕竟我不是作者,只有作者的解读才是最权威的。 当初我学习这本书的时候,只能靠自己摸索,网上搜不到什么好资源。 如果你正在学这本书或者汇编语言,那你有福气了。 本书作者李忠老师,以此书为蓝本,录制了全套视频。 试

汇编语言知识基础介绍

汇编语言是一种低级编程语言,直接与计算机硬件的指令集架构(ISA)对应。它在操作系统、设备驱动程序和性能关键的应用程序中起着重要作用。以下是汇编语言的基础介绍: 1. 基本概念 指令集架构(ISA):汇编语言与特定的处理器架构(如 x86、ARM)对应,每种架构有其特定的指令集。汇编指令:汇编语言的语法是处理器指令的符号表示,通常包括操作码(opcode)和操作数。操作码指定操作的类型,操作数

汇编语言输出“Hello World!“

1.软件 Nasmide64.exe(李忠老师编写) Fixvhdw64.exe(李忠老师编写) VirtualBox虚拟机(免费 开源) 2.过程 01.Fixvhdw64.exe输入以下代码: mov ax,0xb800mov ds,axmov byte [0x00],'H'mov byte [0x02],'e'mov byte [0x04],'l'mov byte [0

ARM——结构体系(处理器工作模式,CPSR,立即数,汇编语言函数调用)

1、处理器工作模式          ARM有7个基本工作模式:User:非特权模式,大部分任务执行在这种模式FIQ:当一个高优先级(fast)中断产生时将会进入这种模式IRQ:当一个低优先级(normal)中断产生时将会进入这种模式Supervisor:当复位或软中断指令执行时将会进入这种模式Abort:当存取异常时将会进入这种模式Undef:当执行未定义指令时会进入这种模式Sy

ARM下汇编语言编程

一、ARM汇编语言程序格式 ARM汇编语言是以段(section)为单位来组织源文件的。段是相对独立的、具有特定名称的、不可分割的指令或者数据序列。 段又可以分为代码段和数据段,代码段存放执行代码,数据段存放代码运行时需要用到的数据。一个ARM源程序至少需要一个代码段,大的程序可以包含多个代码段和数据段。 二、ARM汇编语言中常用的伪操作 例如: area reset,cod

汇编语言05——包含多个段的程序

整理自fishcc论坛 安全的空间 通常来说,0:200~0:300这段空间是相对安全的,操作系统通常不会去占用 但这只有256个字节,当需要更多空间时,可以向操作系统申请 问题: 编程计算以下8个数据的和,结果存在ax 寄存器中: 0123H,0456H,0789H,0abcH,0defH,0fedH,0cbaH,0987H 程序: assume cs

汇编语言04——[BX]和loop指令

整理自fishcc论坛课件 首先展示一个新的程序: assume cs:codesg codesg segment start: mov ax,2000H mov ds,ax mov al,[0] mov bl,[1] mov cl,[2] mov dl,[3] mov ax,4C00H int 21H codesg ends end start 使用masm进行

汇编语言03——第一个汇编程序

整理自鱼C论坛课件 汇编程序编写步骤 编写源代码->使用MASM.exe进行编译,产生目标文件->用LINK.exe,对目标文件进行链接,生成可执行文件 可执行文件中包含两部分内容 1,程序和数据 2,相关的描述信息(程序有多大,要占用多少内存空间等) 源程序: assume cs:abc abc segment mov ax,2 add ax,ax add

汇编语言02——寄存器(内存访问)

整理自鱼C工作室的课件 DS和address DS寄存器通常用来存放要访问的数据的段地址 例如:我们要读取10000H单元的内容可以用如下程序段进行: mov bx,1000H mov ds,bx mov al,[0] 将10000H(1000:0)中的数据读到al中。 mov指令的格式: mov 寄存器名,内存单元地址 “[…]”表示一个内存单元, “[…]

汇编语言01——寄存器(CPU的工作原理)

寄存器概述 CPU的组成:运算器,控制器,寄存器 8086CPU有14个寄存器(8个通用寄存器),分别为: AX,BX,CX,DX,SI,DI,SP,BP,IP,CS,SS,DS,ES,PSW 8086CPU所有寄存器都是16位的,可以存放两个字节(一个字) AX,BX,CX,DX是通用寄存器,存放一般性数据 8086上一代CPU的寄存器是8位的;为保证兼容性,这四个寄存器都可