ASM汇编
汇编语言日常开发记录
林宏权
C++资深开发者
展开
-
汇编字类型的使用
字类型定义的数据在放在汇编代码的前面,所以汇编代码开始处=DS:IP指向的位置-字类型所占用的长度。1.字类型定义 使用 dw ,每个字类型数据用逗号隔开。定义的8个字类型数据最终的求和结果:5BC8。如上面定义的字类型 8个,占用16个字节.原创 2023-06-05 15:37:25 · 85 阅读 · 0 评论 -
汇编内存跨段复制
汇编内存跨段复制。原创 2023-06-05 14:42:29 · 136 阅读 · 0 评论 -
汇编数据段切换的两种方式
实现功能和上面一样,只是比上面多使用了一个ES寄存,不用在循环中每次都修改DS寄存器两次。上面的代码中,第一次DS指向FFFFH段,取FFFF:0的字节数据数据存储入DL寄存。第二次切换DS指向0020H段,将DL寄存器中的内存存储入0020:0的内存单元,整个操作相当于从FFFF:0处复制12个内存单元到0020:0处.第一次DS指向FFFFH,第二次DS指向0020H。上面是使用同一个DS寄存器来切换不同地址段.如下图示,每次使用修改DS的数据来切换。下面使用多个寄存器来切换不同地址段。原创 2023-06-04 16:52:37 · 155 阅读 · 0 评论 -
汇编重复计算之使用循环与不循环使用区别
code segment 表示段开始 ,code ends表示段结束,end表示汇编程序结束。mov al,ds:[0] 表示ds:0内存单元字节送入al寄存器。s: mov al,ds:[bx] //每次循环后指向下一个内存单元。mov dx,ax 表示ax寄存器内容送入dx寄存器。mov ds,ax 表示将ax寄存器值送入ds寄存器。没有使用循环的汇编代码,计算ffff:0-ffff:b的累加之和。mov dx,0 表示将0送入dx寄存器。原创 2023-06-04 14:26:01 · 616 阅读 · 0 评论 -
汇编中使用循环指令Loop
循环次数 ,每执行一次loop后CX的值会减去1。循环执行完成,最后退出程序.debug 下调试与跟踪。单步调试执行汇编指令。原创 2023-06-03 16:41:17 · 236 阅读 · 0 评论 -
MASM编译汇编ASM源码并用Debug调试生成的exe文件
DOS加载EXE到内存过程 PSP占用 16*16字节 为 10H。程序正确的入口地址为 段地址+PSP大小 + 偏移地址。输入t执行程序第一句汇编语句。执行汇编后AX寄存器值已修改。链接对象文件为可执行程序。使用debug调试程序。继续执行下一条汇编指令。编译ASM为对象文件。原创 2023-06-03 12:22:28 · 1376 阅读 · 1 评论 -
汇编栈寄存器SS与SP使用
出入栈后AX,BX寄存器数据交换,入栈时SP=SP-2,出栈时SP=SP+2。DS:[0] ,DS:[2],DS:[4],DS:[6]指向的内存单元数据。将内存段单元数据送入寄存器, 多次送入数据到同一寄存器,前面的数据会被覆盖。将2000:00FC栈单元内存出栈到寄存AX。将2000:00FE栈单元内存出栈到寄存BX。指向SS与IP后,将AX寄存器内存送入栈。指向SS与IP后,将BX寄存器内存送入栈。将默认数据段指定内存单元内容送入栈。将默认数据段指定内存单元内容送入栈。入栈时,栈段地址与偏移地址计算。原创 2023-06-02 23:11:22 · 853 阅读 · 0 评论 -
汇编指令DS:IP,CS:IP,SS:IP指向同一块内存时意义
因为出入栈操作是按字类型来操作,所以每次操作两个连续的内存单元。汇编中一段内存在不同指令指向时所表示的内容是不同的。当DS:IP指向一块内存时,表示是一个数据段。当CS:IP指向一块内存时,表示是一个代码段。当SS:IP指向一块内存时,表示是一个栈段。内存数据通过出入栈复制。原创 2023-06-02 16:41:00 · 623 阅读 · 0 评论 -
内存栈与CPU栈机制
栈顶超界--->栈空间超出,导致栈空间外的数据会覆盖,如下图 1000E ,1000F原来的数据会被覆盖。8086CPU提供相关指令以栈方式来访问内存空间.相当于将一段内存当做栈来使用。8086CPU提供的入栈指令为:PUSH ,出栈指令为:POP。SS:SP指向栈顶元素,PUSH和POP指令执行时,CPU通过SS和SP得到栈顶地址.栈满时使用PUSH再入栈会导致栈顶超界,空栈时使用POP出栈也会导致栈顶超界.栈顶元素总是最后一个入栈,需要时出栈.入栈时要先判断栈是否已满,出栈时要先判断栈是否为空!原创 2023-06-01 23:56:41 · 1226 阅读 · 0 评论 -
汇编指令执行过程及CS与IP和DS寄存器关系与变化
接下来用r指令修改CS值为:2000 ,修改IP值为0,然后用t执行内存的汇编指令,会从CS:IP处开始执行。通过上面操作已准备好1000H:0内存与2000H:0内存的数据。在debug下用a指令先向内存写入下面指令,然后用u指令查看。所有值修改OK后,开始输入t执行汇编指令,t每次执行一行指令。在debug下用a指令先向内存写入下面指令,然后用u指令查看。指令与数据区别,有CS:IP指向的指令才会执行。上面在内存中的汇编指令是如何执行的?最后一次输入t执行汇编,完成所指令执行。再次输入t执行汇编指令。原创 2023-06-01 21:47:44 · 1042 阅读 · 0 评论 -
汇编寄存器之内存访问
]中的数字表示偏移地址,因为是16寄存器,所以按字类型来计算,第一字类型16位,占用二个内存单元,低单元存低字节,高单元存高字节。上面表中, 0,1单元存储了字 4E20H , 2,3 单元中存储了字 0012H ,其中0,2单元为低单元.CPU------------>内存单元地址(段地址*16+偏移地址)---------------->内存单元。MOV al,[0] 这个[0]表示ds默认段中的偏移地址 ,因DS=1000H,所以物理地址=1000:0。0地址字型数据: 4E20H。原创 2023-05-29 17:28:20 · 1678 阅读 · 0 评论 -
汇编指令执行流程与JMP指令使用
在debug窗口输入r 查看默认段寄存器CS指向 0AEC段 指令指针寄存器指向 0100。所以默认物理地址=0x0AEC * 0x10 + 0x0100 = 0xAFC0。跳转后的物理地址=0x2EA3 * 0x10 + 0x0003 = 0x2AE33。执行跳转 JMP 2EA3:3后 CS=2EA3 IP=0003。内存指令执行后CS,IP,AX,BX变化。原创 2023-05-28 18:30:25 · 182 阅读 · 0 评论 -
汇编之CPU使用段寄存器与指令指针寄存器执行内存指令的完整过程
段寄存器: CS (代码段), DS (数据段) , ES (扩展段), SS (栈段)所有指令执行完成后 段寄存器与指令指针寄存器变化。CPU将CS:IP指向的内容当作指令来执行.指令长度决定了IP指向下一条指令的位置。IP指向的内容相当于偏移地址。指令指针寄存器 : IP。IP会随指令的变化而变化。CS指向的内容相当段地址。原创 2023-05-28 16:10:29 · 254 阅读 · 0 评论 -
汇编物理地址计算与段地址认识
内存没有分段,分段来自于CPU,由于CPU使用段地址*16+偏移地址的方式来给出物理地址,所以得用内存段的方式来管理内存,N(N>1)个地址连接的内存单元视为一个地址段,物理地址 = (段地址)0x1230 * 16 + (偏移地址)0x00C8 = 0x12300 + 0x00C8 = 0x123C8。段起始地址只能是16的倍数,段偏移地址为16位,因16位地址的寻址能力为64K,所以一个段最大长是64K。段地址 x 16 = 段的起始地址,用于定位段开始位置,偏移地址用于定位段中的内存单元.原创 2023-05-28 15:29:15 · 5010 阅读 · 0 评论 -
汇编指令调试
mov ah,78后, ax的高位 AH为78 所以 AX=7818。1.打开windows中cmd ,然后输入debug进入汇编调试窗口。mov bx,ax后 AX=7820 BX=7820。2.在汇编调试窗口中输入r 查看当前寄存器相关信息。5.在汇编调试窗口l输入t 按行来执行汇编语句。mov ax,18后,AX=0018。mov ax,8 后 AX=7820。add ax,bx后AX=F040。3.输入a 可进入编写汇编语句。原创 2023-05-27 16:14:10 · 495 阅读 · 0 评论 -
汇编寄存器认识
常用于在变址寻址(基址+变址)中存储变址,也常用来拷贝源字符串。BX: BX(Base Register):基址寄存器,常用于在相对寻址(基址+偏移)中存储基址(基础访问地址)。为了兼容16位模式程序,访问AX,BX,CX,DX相当于访问32位寄存器的低16位,32位寄存器的高16位不可单独访问。为了兼容32位模式程序,使用上面的名字仍然是可以访问的,相当于访问64位寄存器的低32位。寄存器中地址+变址寄存器中地址+偏移量(如: mov ax,[bx+si+100h] 传入基址+变址及偏移量)原创 2023-05-26 17:16:42 · 2275 阅读 · 0 评论 -
汇编基础知识
3.8088CPU数据总线宽度为8 , 8086CPU的数据总线宽度为16,所以这两个CPU在传输16bit数据时使用的时间与次数也不一样,前者要传输两次,后者只需要传输一次.一个CPU的地址总线数为 16 ,那么该CPU的最大寻址单元为 2的16次方, 总地址单元为65536Byte ,也就是64K的大小.如:一个CPU地址总线宽度为8,那么该CPU的可寻址单元为2的8次方,为256个存储单元可寻址,1.CPU地址线总数量,同时也是CPU地址总线宽度.该CPU最大寻址单元为2的地址总线的次方。原创 2023-05-26 15:23:18 · 1749 阅读 · 0 评论 -
汇编入门之windows平台ASM编译与链接
2.链接OBJ为exe文件。1.编译ASM为OBJ。原创 2023-05-25 22:47:19 · 591 阅读 · 0 评论 -
OllyDbg下载与安装
下载1.10版本双击解压直接运行,不用安装。原创 2022-09-13 03:24:56 · 10984 阅读 · 0 评论 -
TASM5.0安装
按向下箭头移动到Start Installtion并回车开始安装。注: TASM5.0只支持32位系统。默认安装路径A盘,改为C然后回车。默认安装目录安装TASM。原创 2022-09-13 03:11:51 · 445 阅读 · 0 评论 -
MASM32汇编SDK安装
打开终端输入ml出现如下图信息表示安装成功。MASM32 SDK自带编译器与IDE。点击install进行SDK安装。双击install.exe运行安装。选择安装盘并点击OK进行安装。适合中国地区下载的链接。下载MASM32 SDK。原创 2022-09-13 02:25:14 · 1313 阅读 · 1 评论