汇编字符串拷贝

Posted ur10ser

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了汇编字符串拷贝相关的知识,希望对你有一定的参考价值。

 1 DATAS SEGMENT
 2     str1 db \'it is a temp string\',0ah, 0dh,\'$\'
 3     str2 db 50 dup(?)
 4     msg1 db 0ah,0dh,\'source string:\',\'$\'
 5     msg2 db 0ah,0dh,\'distance sting:\',\'$\'
 6 DATAS ENDS
 7 
 8 STACKS SEGMENT
 9     ;此处输入堆栈段代码
10 STACKS ENDS
11 
12 CODES SEGMENT
13     ASSUME DS:DATAS,CS:CODES
14 START:
15     MOV AX,DATAS
16     MOV DS,AX
17     
18     lea si,str1;
19     
20     MOV ax,seg str2;
21     mov ES,AX;
22     lea di,str2;
23     
24     mov CX,22;
25 again:
26     movsb;
27     loop again;
28     
29     lea dx,msg1;
30     mov ah,09h;
31     INT 21H;
32     
33     lea DX,str1;
34     mov ah,09h;
35     INT 21H;
36     
37     lea dx,msg2;
38     mov ah,09;
39     INT 21H;
40     
41     lea DX,str2;
42     mov ah,09h;
43     INT 21H;
44     
45     mov ah,4ch;
46     INT 21h;
47 CODES ENDS
48     END START

以上代码参考http://blog.csdn.net/u013507368/article/details/40859081。

汇编传送指令参考http://www.doc88.com/p-296946327212.html

【1】0dh表示回车符号,这只是一个表示这一行终止的符号,不可见的,0Ah表示换行,就是跳转到下一行,两者用表示回车换行!

【2】DUP是数据定义伪指令,它可以按照给定的次数来复制某个(某些)操作数,可以避免多次键入同样一个数据。例如 str1 db 6 dup(12H)和str1 db 12H,12H,12H,12H,12H,12H是等价的。问号是未初始化,不管它的值,只占用字节

【3】要用assume把段跟段寄存器对应起来的原因是原来的DOS找到的空闲内存的地址不是固定的,无法找到一个地址在任何时候都是空闲的。于是DOS需要可以重定位的程序,而当时的定位方式就是设置段寄存器的值使该程序能在可分配(空闲)的内存中可用。那就需要知道某个段被重定位时候需要修改哪个段寄存器的值才能正确执行。assume提供这种段和重定位代码时需要对应修改的寄存器的关系给编译器,编译器再这个信息写到二进制文件中去。比如DOS下的exe程序记录在文件头中。

【4】INT 21H是DOS功能调用,调用功能号放在AH中,使用格式如下:MOV AX fn; INT 21H.DOS系统功能调用参考:http://www.cnblogs.com/ynwlgh/archive/2011/12/12/2285017.html

【5】ES寄存器   附加段寄存器:定义附加段的起始地址。 程序中其他段得起始地址。  用于某些串操作中和DI寄存器相关联  (ES)+(DI)=串地址的结尾。具体例子见https://zhidao.baidu.com/question/539021846.html

【6】MOVSB即字符串传送指令,这条指令按字节传送数据。通过SI和DI这两个寄存器控制字符串的源地址和目标地址,比如DS:SI这段地址的N个字节复制到ES:DI指向的地址,复制后DS:SI的内容保持不变。

【7】变量的存储包括段地址和偏移地址。SEG就是取段地址的。比如:

   data segment

    ore 10h
STRING db \'hello, world$\'
data ends

假设data = 1234h,则:
mov di, seg string ;di = string所在段地址,即1234h
mov ei, offset string; ei = string偏移地址,即10h

以上是关于汇编字符串拷贝的主要内容,如果未能解决你的问题,请参考以下文章

Android 逆向使用 Python 解析 ELF 文件 ( Capstone 反汇编 ELF 文件中的机器码数据 | 创建反汇编解析器实例对象 | 设置汇编解析器显示细节 )(代码片段

ARM中C和汇编的相互调用(5个数求和字符串拷贝)

嵌入式高手进 考试题解答

Android 逆向使用 DB Browser 查看并修改 SQLite 数据库 ( 从 Android 应用数据目录中拷贝数据库文件 | 使用 DB Browser 工具查看数据块文件 )(代码片段

Android 逆向使用 DB Browser 查看并修改 SQLite 数据库 ( 从 Android 应用数据目录中拷贝数据库文件 | 使用 DB Browser 工具查看数据块文件 )(代码片段

86/88汇编代码的执行调试