![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
AssemblyLanguage
汇编语言
Wαff1ε
无法达成的目标才是我的目标,迂回曲折的路才是我想走的路,而每次的歇息,总是带来新的向往
展开
-
SI 和 DI 寄存器的区别
SI(source index)是源变址寄存器DI(destination index)是目的变址寄存器SI和DI可以用来存放数据、地址,功能类似、用法类似、一般使用哪个都可以。但需要注意的是:在串处理指令中,SI用作隐含的源串地址,默认在DS中;DI用做隐含的目的串地址,默认在ES中;此时不能混用。字符串处理指令:是一种非数值处理指令,一般包括字符串传送、字符串转换(把一种编码的字符串转换成另一种编码的字符串)、字符串替换(把某一字符串用另一字符串替换)等。这类指令在文字编辑中对大量字符串进原创 2020-12-07 10:58:05 · 8670 阅读 · 0 评论 -
常用DOS系统功能调用(INT 21H)一览表
原创 2020-12-02 21:56:18 · 2990 阅读 · 0 评论 -
使用汇编软件emu8086输出十次Hello World!
安装8086emu软件emu8086软件安装步骤:下载后,一直next即可。输出Hello World!1、new新建文件——》选择exeassume cs:code, ds:datadata segment db 'hello world!',0dh,0ah,'$' ;换行0dh 加 回车0ah ;enter db 0dh,0ah,'$';回车换行data endscode segmentstart: mov ax,data mov ds,ax原创 2020-12-02 20:52:19 · 2959 阅读 · 0 评论 -
ret指令 和 retf指令
当执行ret指令时,相当于执行pop ip当执行retf指令时,相当于先执行pop ip,后执行pop csret指令用栈中的数据,修改ip的内容,从而实现近转移;retf指令用栈中的数据,修改cs和ip的内容,从而实现远转移CPU执行ret指令时,进行下面两步操作:(1)IP=((SS)*16)+(SP))(2)SP=SP+2CPU执行retf指令时,进行下面4步操作:(1)IP=((SS)*16)+(SP))(2)SP=SP+2(3)CS=SS * 16+SP(4)SP=SP+原创 2020-11-30 17:31:58 · 7522 阅读 · 0 评论 -
实验九 根据材料编程(改变字体颜色)
编程:在屏幕中间分别显示 绿色、绿底红色、白底蓝色的字符串’welcome to masm!'*一个字符在屏幕上占用两个字节 低地址存放ASCII码,高地址存放字符的属性编程所需要的的知识:8025彩色字符模式显示缓冲区(以下简称为显示缓冲区)的结构:内存地址中,B8000H~BFFFFH共32kb的空间,为8025彩色字符模式的显示缓冲区。向这个地址空间写入数据,写入的内容将立即出现在显示器上。在80*25彩色字符模式下,显示器可以显示25行,每行80个字符,每个字符可以有256种属性(背景色原创 2020-11-24 09:48:40 · 850 阅读 · 0 评论 -
XCTF-Reverse:simple-unpack
题目地址:https://adworld.xctf.org.cn/task/answer?type=reverse&number=4&grade=0&id=5077&page=1工具:ExeinfoPE(查壳工具)、kali系统、ida pro知识:学习 UPX脱壳方法一、发现不少我们熟知的e可执行文件——》考虑用十六进制编辑器打开——》.ELF文件ELF文件格式:在计算机科学中,是一种用于二进制文件、可执行文件、目标代码、共享库和核心转储格式文件。是UNI.原创 2020-11-20 20:05:17 · 429 阅读 · 0 评论 -
重做实验七 寻址方式在结构化数据访问中的应用
先处理第一行所有数据:;实验七 寻址方式在结构化数据访问中的应用;编程 将data段中的数据 按照如下格式写到table段中,并计算21年中的人均收入(取整);结果也按照下面的格式保存在table段中assume cs:code,ds:data,ss:stackdata segment db '1975','1976','1977','1978','1979','1980','1981','1982','1983' db '1984','1985','1986','1987','1988原创 2020-11-18 23:47:34 · 197 阅读 · 0 评论 -
转移地址在内存中的jmp指令 检测点9.1
转移地址在内存中的jmp指令有两种格式:(1)jmp word ptr 内存单元地址(段内转移)功能:从内存单元地址处开始存放着一个字,是转移的目的偏移地址。mov ax,0123hmov ds:[0],axjmp word ptr ds:[0]执行之后IP=0123h(2)jmp dword ptr 内存单元地址(段间转移)功能:从内存单元地址处开始存放着两个字,高地址处的字是转移的目的段地址,低地址处,是转移的目的偏移地址。CS=内存单元地址+2IP=内存单元地址mov ax,原创 2020-11-16 22:53:58 · 580 阅读 · 0 评论 -
转移的目的地址在指令中的jmp指令 & 转移地址在寄存器中的jmp指令
机器码中并没有包含转移的目的地址,只是给了一个位移的范围,通过位移的方式,实现对ip寄存器的修改。转移的目的地址在机器码中的jmp指令jmp far ptr s转移的目的地址在寄存器中的jmp指令mov ax,2233Hjmp axax中的值会覆盖ip转移的目的地址在内存中的jmp指令转移地址在内存中的jmp指令有两种格式:(1)jmp word ptr 内存单元地址(段内转移)功能:从内存单元地址处开始存放着一个字,是转移的目的偏移地址内存地址的表示需要段地址和偏移地址mov原创 2020-11-14 22:46:58 · 2229 阅读 · 0 评论 -
loop转移指令
loop指令为循环指令,所有的循环指令都是短转移指令所有条件转移指令都是短转移指令,对于的机器码中包含了位移的范围(-128~127)这个位移范围是编译器在编译的时候计算出来的指令格式:loop 标号(cx=cx-1,如果cx≠0,转移到标号处执行)操作:(1)cx=cx-1(2)如果cx≠0,IP=IP+八位位移 (不低于0则进行跳转,等于零则继续运行下面的程序)八位位移=标号处的地址-loop指令后第一个字节的地址问题:补全编程,利用loop指令,实现在内存2000H段中查找第一个值为0原创 2020-11-14 22:13:36 · 1078 阅读 · 0 评论 -
jcxz指令
jcxz指令为有条件转移指令,所有的有条件转移指令都是短转移(jmp为无条件转移指令),在对应的机器码中包含转移的位移,而不是目的地址。对ip的修改范围都为-128~127j=jmpcx=cx寄存器z=zero=0======>含义:在cx寄存器中的值为0时跳转与loop指令相反(在cx中值不为零时跳转)当cx≠0时什么都不做注意:所有的有条件有条件转移都是短转移,且经过编译之后,机器码包含了位移范围如:EBXX(XX表示位移范围)XX是由编译器编译的时候执行的公式:标号处的偏移地原创 2020-11-14 21:53:24 · 2790 阅读 · 0 评论 -
实验八 分析一个奇怪的程序
;分析下面的程序,在运行前仔细思考:这个程序可以正确的返回吗?运行后在思考:为什么是这样的结果?通过这个程序加深对相关内容的理解。assume cs:codesgcodesg segment mov ax,4c00h int 21hstart: mov ax,0 s: nop nop mov di,offset s mo原创 2020-11-14 21:11:54 · 158 阅读 · 0 评论 -
操作符offset 和 jmp指令
转移指令的原理转移指令:可以修改IP或者同时修改CS和IP的指令(jmp、loop、call)总的来说,转移指令就是可以控制CPU执行内存中某处代码的指令。8086的转移行为有一下几类:只修改ip时,称为段内转移,比如:jmp ax同时修改cs和ip,称为段间转移,比如:jmp 1000:0由于转移指令对IP的修改范围不同,段内转移,又分为:短转移和近转移短转移IP的修改范围为:-128~127近转移的IP修改范围为:-32768~32767loop——》无条件转移指令jmp——原创 2020-11-12 19:37:16 · 2485 阅读 · 0 评论 -
实验七 寻址方式在结构化数据访问中的应用
下面的程序中,已经定义好了这些数据;实验七 寻址方式在结构化数据访问中的应用;编程 将data段中的数据 按照如下格式写到table段中,并计算21年中的人均收入(取整);结果也按照下面的格式保存在table段中assume cs:code,ds:data,ss:stackdata segment db '1975','1976','1977','1978','1979','1980','1981','1982','1983' db '1984','1985','1986','19.原创 2020-11-11 21:10:10 · 1472 阅读 · 2 评论 -
伪指令dd 和 操作符dup
伪指令dddb:define byte 定义字节型数据 —— 八位数据dw:define word 定义字型数据 —— 十六位数据dd:double word 定义双字型数据 —— 三十二位数据比如:data segment dd 1 dw 1 db 1data ends可以用debug观察内存分配情况问题:用div计算data段中第一个数据除以第二个数据后的结果,商存放在第三个数据的存储单元中data segment dd 100001; 100001B=186A1H原创 2020-11-10 22:24:51 · 2166 阅读 · 0 评论 -
div指令
div是除法指令,使用div做除法要注意以下问题:(1)除数:有八位和十六位两种,在一个寄存器reg中或者在一个内存单元中。(2)被除数:默认放在AX 或者 DX和AX中,如果除数为8位,被除数则为16位,默认被除数存放在AX中如果除数为16位,则被除数为32位,被除数存放在DX和DX中(DX存放高16位,AX存放低16位)(3)结果:如果除数为8位,则商储存在AL中,余数储存在AH中如果除数为16位,则AX储存商,DX储存余数不要强行记忆这些规则,去做题理解!格式:div 寄存器(这里原创 2020-11-10 21:36:11 · 13095 阅读 · 0 评论 -
不通过寄存器确定数据的长度 + 案例
不通过寄存器确定数据的长度在8086CPU指令中,可以处理byte和word两种尺寸的数据。所以要在机器指令指明,指令进行的是字操作还是字节操作。(1)通过寄存器名指明操作对象指明进行字操作:mov ax,1mov bx,ds:[0] ;取一个字型数据mov ds,axmov ds:[0],ax ;把一个字型数据放进去inc axadd ax,1000指明进行字节操作:mov al,1mov al,bl ;位数一致mov al,ds:[0] ;取一个字节型数据mov d原创 2020-11-10 20:43:58 · 115 阅读 · 0 评论 -
不同的寻址方式的应用——将每行单词的前X个字母改为大写
编程,将data段中每个单词的前4个字母改为大写代码如下:;将data段每个单词的前四个字母改为大写字母assume cs:code,ss:stack,ds:datastack segment dw 0,0,0,0 dw 0,0,0,0 dw 0,0,0,0 dw 0,0,0,0stack ends ;非常重要!!!↓data segment ; '0123456789ABCDEF' ;数据在内存中分布不同——》 ;会导致我们编写代码的时候,需要用不同的访问原创 2020-11-09 19:43:05 · 158 阅读 · 0 评论 -
不同的寻址方式的应用——将每行的单词都变成大写
编程,将data段中每个字母改为大写字母;编程,将data段中每个字母改为大写字母assume cs:code,ds:datadata segment ;'0123456789ABCDEF' db 'ibm ' ;IBM db 'dec ' db 'dos ' db 'vax '; 要四行,每一行有三个字母需要变成大写,怎么做?; 首先想怎么把第一行的三个字母变成大写data end原创 2020-11-09 19:15:42 · 257 阅读 · 0 评论 -
不同寻址方式的灵活应用——改变每个单词首字母大小写
编程:将data段中每个单词的头一个字母改为大写;编程:将data段中每个单词的头一个字母改为大写assume cs:code,ds:datadata segment ;'0123456789ABCDEF' db '1. file ' db '2. edit ' db '3. search ' db '4. view ' db '5. options ' db '6. help 'data e原创 2020-11-09 12:33:26 · 262 阅读 · 0 评论 -
用SI 和 DI实现字符串的复制
用si和di实现将字符串’welcome to masm!'复制到它后面的数据区中。;用si和di实现将字符串'welcome to masm!'复制到它后面的数据区中。assume cs:code,ds:datadata segment db 'welcome to masm!' db '................'data endscode segment start: mov ax,data mov ds,ax mov si,0 mov di,16 ;设原创 2020-11-09 11:29:00 · 1193 阅读 · 0 评论 -
用[bx+idata]的方式进行数组的处理
[bx+idata]也就是[bx+数字]如:ds:[bx+5]指令mov ax,[bx+200]的含义将一个内存单元的内容送入ax,这个内存单元的长度为两个字节,存放一个字,偏移地址为bx中的数值加上200,段地址在ds中。数学表示:(ax)=((ds)*16+(bx)+200)该指令也可以写成如下格式(常用):mov ax,[200+bx]mov ax,200[bx]mov ax,[bx].200编写代码,将datasg定义中的第一个字符转化为大写,第二个字符转化为小写方法1:按照.原创 2020-11-08 22:24:47 · 266 阅读 · 0 评论 -
汇编语言之大小写转换问题
打开记事本——》alt+右边的小键盘(可以查看ASCII对应的字符)eg:打开记事本——》按住alt键,并在右边小键盘打97,松开alt,可以看到出现a——》得知97对应的字符为a上图中绿色的横行和纵行组成对应字符的十六进制通过对比大写字母的ASCII码的值比小写字母小20H : ASCII(a)-20H=ASCII(A)通过观察还可以得出大小写的差距字体现在二进制的第五位案例:编写一段代码,将datasg中第一个字符串全转化为大写,第二个字符串全转化为小写assume cs:co..原创 2020-11-08 21:52:59 · 1192 阅读 · 0 评论 -
实验五 编写、调试具有多个段的程序
(1)将下面的程序编译链接,用debug加载、跟踪,然后回答问题☆☆☆☆☆pop ax是指从栈顶取出的数据送入axpush ax是指将寄存器ax的内容送入栈中第一问:第二问:第三问:③设程序加载后,code段的段地址为X,则data段的段地址为__x-2_,stack段的段地址为__x-1_。(2)将下面的程序编译、连接,用debug加载、跟踪,然后回答问题。第一问:第二问:第三问:③设程序加载后,code段的段地址为X,则data段的段地址为__x-2_,stac原创 2020-11-08 12:19:43 · 1587 阅读 · 3 评论 -
将数据、代码、栈放入不同的段
在前面的内容中,我们在程序中用到了数据和栈,将数据、栈、和代码都放到一个段里面。我们在编程的时候要注意何处是数据、何处是栈、何处是代码。这样做的两个问题:①把它们放到一个段中使程序更加的混乱②当数据较少的时候放到一个段里没有问题。但是如果数据、栈、代码需要空间超过64kb,就不能放到一个段中。(一个段的容量不能大于64kb,是8086,不是所有处理器都这样)所以要考虑用多个段来存放代码、数据、栈不能写“mov ds,data”,因为8086CPU不允许将一个数值直接送入段寄存器...原创 2020-11-07 21:54:56 · 355 阅读 · 0 评论 -
在代码段中安排自己定义的栈空间
如何定义自己的栈(通过系统分配的内存)完成下面的程序,利用栈。将程序中定义的数据逆序存放。我们之前是如何安排自己的栈?设置SS:SP(SS为栈顶的段地址存放处,栈顶偏移地址存放在SP)我们如何在程序中定义自己的栈?assume cs:codecode segment dw 0123H,0456H,0789H,0ABCH,0DEFH,0FEDH,0CBAH,0987H dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 start: m原创 2020-11-07 21:18:00 · 242 阅读 · 0 评论 -
在代码段中安排自己定义的数据
1、编程计算下面八个字型数据之和,将结果存放在ax寄存器中1,2,3,4,5,6,7,8通过前面的学习:将这一段数据安排在一段连续的内存中——>通过Loop指令,用add ax, ds:[bx] add bx,2 ——>设置内存地址,把ds:[bx]指向“1”的位置以前是通过e指令去修改一段内存(不安全)——》如何让系统分配给我们内存?(加载的过程其实就是系统分配给程序内存的过程)——》只要把数据写在源文件就行了程序取得所需空间的方法有两种:一是在加载程原创 2020-11-07 20:45:03 · 365 阅读 · 0 评论 -
实验四 [bx]和loop的使用+段前缀
(1)编程,向内存0:200~0:23F依次传送数据0 ~63(3FH)assume cs:codecode segment mov ax,20H mov es,ax;数据传到哪里去 mov cx,64 mov bx,0 mov dl,0 ;逻辑清晰loop setnumber: mov es:[bx],dl inc bx ;increase自增 inc dl loop setnumber mov ax,4c00h int 21hcode endsend(原创 2020-11-06 23:23:01 · 257 阅读 · 0 评论 -
求一段内存中的字节型数据的和
题目:用编程求FFFF:0~ FFFF:F字节型数据的和存放在dx中注意写代码时要注意代码的阅读性、初始化、数据从哪里来放到哪里去assume cs:codecode segment mov ax,0FFFF ;字母型数据前面必须加个0 mov ds,ax ;数据从FFFF来 mov bx,0 ;偏移地址为0 moc cx,16 ;循环16次 mov ax,0 ;ah=0,al=读取的字节数据AddNumber: mov al,ds:[bx] ;读取数据 add dx原创 2020-11-06 21:32:23 · 246 阅读 · 0 评论 -
将某内存单元数据做乘法 + 内存间数据的复制
题目:将内存FFFF:0~FFFF:F内存单元中的数据复制到0:200 ~ 0:20F中编程的时候要搞清楚,数据从哪来,要放到哪去。还要注意初始化方法一:方法一中push ds,但是没有设置栈段,比较危险哦!方法二:方法二中不断修改ds,很浪费CPU的操作优化:方法三:引入es寄存器(和数据相关)——》个人编程习惯:将ds代表数据从哪来es表示数据到哪去该方法要循环16次——》实现从字节型数据复制——》如何实现字型数据的复制再优化:方法四:...原创 2020-11-06 21:11:30 · 325 阅读 · 0 评论