汇编学习记录
前言
这篇文章是自己在专升本录取~本科开学前学习记录,破解软件的学习在2022年4月 - 2022年5月,汇编学习时间大约为2022年7月 - 2022年9月,我将往期上传的博文整理为一篇文章,作为归纳总结。
以后若继续学习相关领域,此文会更新。
文章目录
- 前言
- 一、破解
- 1.OD软件界面基本介绍
- 2. 破解软件实战
- 二、汇编
- 1.计算123*236(十进制)结果存放在AX中
- 2.用编程求FFFF:0到FFFF:F字节型数据的和,结果存放在dx中
- (1) 代码
- (2)debug关键步骤
- 3.将内存FFFF:0 ~ FFFF:F 内存单元中的数据复制到 0:200 ~ 0:20F 中
- (1)代码
- (2)改进
- (3)改进
- 4.向内存0:200 ~ 0:23F 依次传送数据 0~63(3FH),只能使用9条指令 20:00 3f
- 5.编程计算下面8个数据的和,结果放在ax寄存器中
- 6.(章节7.10) 不同寻址方式的灵活应用
- (1)将datasg段中每个单词改为大写字母
- (2)将datasg段中每个单词的前4个字母改为大写字母
- (3)(章节8.6)寻址方式的综合应用
- 7.(章节8.7).div
- 8.用div计算data段中的第一个数据除以第二个数据,商存放在第三个数据的存储单元中
- 9.(章节8.9)dup指令
- 总结
一、破解
时间:2022年4月15日
1.OD软件界面基本介绍

本章链接:OD零基础入门教程_哔哩哔哩_bilibili
OD:即ollydbg
前言:本节是软件的基本介绍,以图片+注释的方式作为笔记。
放到这里,可供跟我一样的小白一块参考。
祝愿一起进步。





2. 破解软件实战
教程点击此处
补充知识:
1.搜索关键字方法
插件 -> 中文搜索引擎 -> ASCLL -> ctrl+F
右击 -> 二进制 -> nop填充
右击 -> 复制到可执行文件 ->全部复制
右击弹出来的窗口 -> 保存。
有壳的只能做补丁,
没壳的可以保存。
二、汇编
时间:2022年7月~2022年9月
1.计算123*236(十进制)结果存放在AX中
assume cs:codecode segment
;用编程进行加法计算123*236(十进制)结果存放在AX中
;eg: 10*3 = 10 + 10 + 10mov ax,123 ;设置为123合适 cs即循环次数;循环次数少时间复杂度低mov cx,axmov ax,0addNumber: add ax,236loop addNumbermov ax,4c00hint 21hcode ends
end
2.用编程求FFFF:0到FFFF:F字节型数据的和,结果存放在dx中
(1) 代码
assume cs:codecode segment
; 用编程求FFFF:0到FFFF:F字节型数据的和,
;结果存放在dx中;1.做好初始化。即使默认为0
;2.注意数据从哪里来,到哪里去mov ax,0ffffh mov ds,ax ;数据来源mov bx,0 ;偏移地址mov dx,0 mov cx,16 ;循环16次mov ax,0 ;ah=0,al读取字节型数据,ax与dx相加addNumber:mov al,ds:[bx] ;取数据add dx,axinc bxloop addNumbermov ax,4c00hint 21hcode ends
end
0588h
(2)debug关键步骤




3.将内存FFFF:0 ~ FFFF:F 内存单元中的数据复制到 0:200 ~ 0:20F 中
(1)代码
assume cs:codecode segment
; 将内存FFFF:0 ~ FFFF:F 内存单元中的数据复制到
; 0:200 ~ 0:20F 中; 分析:目标地址可看做段地址20h,偏移地址0~fmov bx,0 ;偏移地址mov dx,0 mov cx,16 ;循环16次addNumber:mov ax,0ffffh mov ds,ax ;数据来源mov dx,ds:[bx] ;取数据mov ax,20hmov ds,axmov ds:[bx],dxinc bxloop addNumbermov ax,4c00hint 21hcode ends
end

(2)改进
上面需要不断地修改段地址寄存器,是一种很浪费CPU的操作
assume cs:codecode segment
; 将内存FFFF:0 ~ FFFF:F 内存单元中的数据复制到
; 0:200 ~ 0:20F 中; 分析:目标地址可看做段地址20h,偏移地址0~f; es寄存器和数据相关
; 习惯:
; ds代表数据来源,es代表数据去向mov ax,0ffffh mov ds,ax ;数据来源mov ax,20hmov es,axmov bx,0 ;偏移地址mov cx,16 ;循环16次addNumber:mov dl,ds:[bx] mov es:[bx],dlinc bxloop addNumbermov ax,4c00hint 21hcode ends
end

(3)改进
前面是用字节形数据,现在是用字形数据,循环8次,比原先减少了一半。
assume cs:codecode segment
; 将内存FFFF:0 ~ FFFF:F 内存单元中的数据复制到
; 0:200 ~ 0:20F 中; 分析:目标地址可看做段地址20h,偏移地址0~f; es寄存器和数据相关
; 习惯:
; ds代表数据来源,es代表数据去向mov ax,0ffffh mov ds,ax ;数据来源mov ax,20hmov es,axmov bx,0 ;偏移地址mov cx,8 ;循环8次addNumber:mov dx,ds:[bx] mov es:[bx],dx;push ds:[bx];pop es:[bx]add bx,2loop addNumbermov ax,4c00hint 21hcode ends
end

4.向内存0:200 ~ 0:23F 依次传送数据 0~63(3FH),只能使用9条指令 20:00 3f
assume cs:codecode segment
;向内存0:200 ~ 0:23F 依次传送数据 0~63(3FH)
;只能使用9条指令 20:00 3f mov ax,20hmov ds,axmov bl,0hmov cx,64Number: mov ds:[bx],blinc blloop Numbermov ax,4c00hint 21hcode ends
end

5.编程计算下面8个数据的和,结果放在ax寄存器中
assume cs:codecode segment;编程计算下面8个数据的和,结果放在ax寄存器中
1,2,3,4,5,6,7,8dw 1,2,3,4,5,6,7,8start: mov bx,0mov ax,0mov cx,8addNumber:add ax,cs:[bx]add bx,2loop addNumbermov ax,4c00hint 21hcode endsend start

6.(章节7.10) 不同寻址方式的灵活应用
(1)将datasg段中每个单词改为大写字母
assume cs:codesg,ds:datasgdatasg segmentdb 'file 'db 'edit 'db 'sear 'db 'view 'db 'view 'dw 0 ;50h
datasg endscodesg segment
start:mov ax,datasgmov ds,axmov cx,5mov bx,0upRow: mov ds:[50h],cxmov si,0mov cx,4upletter:mov al,[bx+si]and al,11011111bmov [bx+si],alinc siloop uplettermov cx,ds:[50h]add bx,16loop upRowmov ax,4c00hint 21hcodesg endsend start
以栈的方式
assume cs:codesg,ds:datasgdatasg segmentdb 'file 'db 'edit 'db 'sear 'db 'view 'db 'view 'datasg endsstack segmentdw 0,0,0,0dw 0,0,0,0dw 0,0,0,0dw 0,0,0,0
stack endscodesg segment
start:mov ax,stackmov ss,axmov sp,32mov ax,datasgmov ds,axmov cx,5mov bx,0upRow: push cx ;保存到栈中mov ds:[50h],cxmov si,0mov cx,4upletter:mov al,[bx+si]and al,11011111bmov [bx+si],alinc siloop upletterpop cxadd bx,16loop upRowmov ax,4c00hint 21hcodesg endsend start



(2)将datasg段中每个单词的前4个字母改为大写字母
assume cs:code,ss:stack,ds:datastack segmentdw 0,0,0,0dw 0,0,0,0dw 0,0,0,0dw 0,0,0,0
stack endsdata segmentdb '1. display 'db '2. brows 'db '3. replace 'db '4. modify '
data endscode segmentstart:mov ax,stackmov ss,axmov sp,32mov ax,datamov ds,axmov bx,0mov cx,4upRow:push cxmov cx,4mov si,0upLetter: mov al,ds:[bx+3+si]and al,11011111bmov ds:[bx+3+si],alinc siloop upLetterpop cxadd bx,16loop upRowcode ends
end start



(3)(章节8.6)寻址方式的综合应用
assume cs:code,ss:stack,ds:datadata segmentdb 'DEC'db 'Ken Olsen'dw 137 ;排名 ->38 ;12dw 40 ;收入 -> 110 ;14 db 'POP' ;著名产品->VAX ;16
data endsstack segmentdw 0,0,0,0dw 0,0,0,0dw 0,0,0,0dw 0,0,0,0
stack endscode segmentstart: mov ax,stackmov ss,axmov sp,32mov ax,datamov ds,axmov bx,0mov word ptr ds:[bx+12],38add word ptr ds:[bx+14],70mov si,0mov byte ptr ds:[bx+16+si],'V'inc simov byte ptr ds:[bx+16+si],'A'inc simov byte ptr ds:[bx+16+si],'X'code endsend start
7.(章节8.7).div
assume cs:code,ss:stack,ds:datadata segmentdb 6Ah,18h,0,01hdb 3,0,0,0db 0,0,0,0db 0,0,0,0
data endsstack segmentdw 0,0,0,0dw 0,0,0,0dw 0,0,0,0dw 0,0,0,0
stack endscode segmentstart:mov ax,stackmov ss,axmov sp,32mov ax,datamov ds,ax;除数是8位;1.;mov ax,16;mov bl,3;div bl ;AX=0105H;2.;mov ax,16;div byte ptr ds:[0] ;AX=0105H;除数是16位;1.;mov ax,ds:[0];mov dx,ds:[2];mov bx,3;div bx ;AX=0005H DX=0001H(余数);2.;div word ptr ds:[4] ;AX=0005H DX=0001H(余数);习题:计算100001(186A1H) / 100(64H);mov dx,1;mov ax,86A1h;mov bx,100;div bx;习题:计算1001 / 100;mov ax,1001;mov bl,100;div blmov ax,1001mov bx,256div bxcode endsend start

8.用div计算data段中的第一个数据除以第二个数据,商存放在第三个数据的存储单元中
assume cs:code,ds:data,ss:stack;用div计算data段中的第一个数据除以第二个数据,商存放在第三个数据的存储单元中
data segmentdd 100001dw 100dw 0
data endsstack segmentdw 0,0,0,0dw 0,0,0,0dw 0,0,0,0dw 0,0,0,0
stack endscode segment
start:mov ax,stackmov ss,axmov sp,32mov ax,datamov ds,axmov ax,ds:[0]mov dx,ds:[2]div word ptr ds:[4]mov ds:[6],axmov ax,4c00hint 21hcode ends
end start

9.(章节8.9)dup指令




总结
提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。