- 博客(14)
- 收藏
- 关注
原创 x86汇编基础学习
数组本质上就是多个数据的集合,在内存中按照一定顺序排列,角标即为每个数据的偏移值,如果使用db进行数据的定义那么两个数据之间的偏移值为1个字节,如果使用dw指令定义数据,则偏移值为2个字节批量定义三个连续的数据 每个数据的偏移量为1 在内存中的排列为 111data ends批量定义三个连续的数据 每个数据的偏移量为1 在内存中的排列为 123123123data ends数组的打印data endsstart:mov ds,axcode endsend start。
2023-10-04 10:07:56
53
1
原创 x86汇编基础学习
这条指令时,会连续从栈中pop两次数据,第一次的数据赋值给CS,第二次的数据赋值给IP,那么如果我们想要跳转到指定的指令,需要将该指令的段地址和偏移地址分别push进栈中。(jmp cx zero):条件转移指令,功能和jmp意义,只是需要满足条件,也就是当cx寄存器中的值为0时,进行跳转。标号里面存放的是ip偏移地址 如果写成call 3H 那么意思就是跳转到CS:0003H这个位置。ds:[0]存放的是ip值,ds:[2]存放的是cs的值。被包裹在同一个段中,段地址相同,可省略 jmp 偏移地址。
2023-10-03 20:46:13
185
1
原创 x86汇编之别名数据的一种简单读写方式
别名str中存放的数据量和db,dw有关,如果是db,那么别名默认取一个字节数据,如果是dw,别名默认取两个字节数据,可以使用b.和w.进行数据量的调节。前面我们只介绍了b.str[0],表示读取一个字节的数据,另外一种w.str[0]表示读取一个字的数据。直接使用别名+[偏移量]的形式获取或者修改已经定义好的数据。, 这也就是为什么咱们能够直接通过别名来获取第一个字符。
2023-10-02 22:51:23
59
1
原创 x86汇编学习之字符串打印
补充: 在8086中系统提供了一个显示服务(Video Service)中断供我们使用,使用10H这个中断码也可以打印带有颜色属性的字符串。为什么是160而不是80 以内一个字符占两个字节的空间, 80个字符总共偏移了160。为什么是160而不是80 以内一个字符占两个字节的空间, 80个字符总共偏移了160。屏幕默认显示80x25个字符,全屏显示106x38个字符,那么可以根据这个特性,让字符上下移动。mov ah,9;mov cx,3;mov ah,2;mov bh,0;mov bh,0;
2023-09-26 20:14:47
215
1
原创 x86汇编学习
在8086的内存地址结构中,B8000H~BFFFFH 这部分的内存区域为显存区域,一旦向这个地址空间写入数据cpu会从0号偏移地址开始读取数据然后显示输出,(每写入一次数据就从0开始读取一次)在这块区域中,每个字符固定占用两个字节的空间,也就是ds:[0] 和ds:[1]存放一个字符的信息,前者存放字符具体的内容,后者存放字符对应的颜色。由于cpu会从0号偏移地址开始读取数据然后显示输出,因此假如你直接在6号偏移地址写入字符数据,那么前面三个数据会以占位形式存在。第5个二进制位表示字符是否高亮。
2023-09-25 23:50:04
68
1
原创 x86基础学习
栈段里面存放的也是数据和数据段无异,只不过与数据的排列方式不一样,正常的排列方式是数据从低地址往高地址进行偏移存放,读取数据也是从低地址到高地址,而栈则是写入数据,从高到低进行偏移,读取数据从低地址到高地址。由于这个特性,所以我们在定义一块空间为栈空间到时候,都会先往高地址偏移一段空间。pop push 默认从SS寄存器中读取数据作为栈段地址,因此不能使用其他寄存器充当栈段寄存器。SS寄存器可以存放数据段的段地址。数据高地址往低地址逆序偏移存放。SS寄存器标记的空间为栈空间。一次读写两个字节的数据。
2023-09-23 01:11:09
29
1
原创 x86基础学习
内存中存放的数据都是十六进制数据,如果这些十六进制数据被标为数据,那么cpu在读取时,读到多少就是多少,如果被标记为指令,那么cpu会将这些十六进制转成指令进行执行。CS:用于存放指令所在的段地址,IP寄存器存储当前正在执行的指令对应的偏移地址,读取时将数据转换为指令并执行。DS:用于存放数据的段地址,数据对应的偏移地址使用bx 来存放,里面存的什么读出来就是什么。SS:用于存放栈空间对应的段地址,SP寄存器存放栈空间偏移量,SS和SP配合使用。ES:一般用于DS的替补,与DS用法一致。
2023-09-21 23:55:48
24
1
原创 x86基础学习
1、类似于高级语言中的while循环,系统默认从cx寄存器中读取数据作为循环的条件,当cx中的值cx- 1大于零时循环执行一次代码。没有offset str表示偏移地址所指向的数据[](取内容)需求2:将内存中的hello修改为wowowo。注:在同一个段包裹中,偏移地址从0开始,依次递增。需求1:将内存中的he修改为wo。sub/add 内存地址,通用寄存器。sub/add 通用寄存器,内存地址。3、加减运算指令add和sub。一、字符串的修改和替换。2、offset的作用。二、Loop循环指令。
2023-09-18 23:25:53
22
原创 x86基础学习
段寄存器不能直接赋值,必须借用通用寄存器。从内存中一次读取数据的多少取决于寄存器的容器大小。ds:[0] : 必须借助通用寄存器赋值。注:编写时注意宽度匹配。
2023-09-17 22:41:54
28
原创 x86汇编基础学习
3、函数声明(并非高级语言中的函数,只是方便理解)注:使用dw定义字符串时,字符串长度是2的倍数。给数据添加别名:str db 'hello'物理地址 = 段地址 +偏移地址。4、字符串的定义和获取。dw:定义字(2字节)数据别名中存放偏移地址。使用段包裹,找寻段地址。
2023-09-16 15:58:05
51
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人