博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
汇编字符串拷贝
阅读量:6544 次
发布时间:2019-06-24

本文共 1923 字,大约阅读时间需要 6 分钟。

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 ENDS11 12 CODES SEGMENT13     ASSUME DS:DATAS,CS:CODES14 START:15     MOV AX,DATAS16     MOV DS,AX17     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 ENDS48     END START

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

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

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

【2】是数据定义伪指令,它可以按照给定的次数来复制某个(某些)操作数,可以避免多次键入同样一个数据。例如 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】寄存器   附加段寄存器:定义附加段的起始地址。 程序中其他段得起始地址。  用于某些串操作中和寄存器相关联  ()+()=串地址的结尾。具体例子见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

转载于:https://www.cnblogs.com/ur10ser/p/7798196.html

你可能感兴趣的文章
解决Mac启动Eclipse Memory Analyzer报错问题
查看>>
自己写的进度条###
查看>>
实现批量添加20个用户,用户名为user1-50,密码为user后面跟5个随机字符
查看>>
Net命令详解
查看>>
CentOS linux 高可用集群之heartbeat
查看>>
Logwatch日志分析工具
查看>>
docker 基本操作Ⅱ(关于镜像操作)
查看>>
分工與合作
查看>>
轻松设置站点对ASP危险组件的调用权限
查看>>
看懂“拜占庭容错”,也就看懂了区块链的核心技术
查看>>
APMServ 5.2.6 Win7 Apache启动失败,请检查相关配置
查看>>
了解痘痘起因才能彻底告别痘痘烦恼
查看>>
Java 日志 详解
查看>>
openstack虚拟化技术和镜像制作
查看>>
一个超棒的jQuery通知栏插件 - jBar
查看>>
分享17个漂亮的电子商务网站
查看>>
JavaScript实用手册
查看>>
dpkg参数
查看>>
AS3!INT
查看>>
memcache--mysql测试
查看>>