当前位置:网站首页>汇编语言学习(二)
汇编语言学习(二)
2022-08-09 13:30:00 【目标是技术宅】
今天学习了王爽《汇编语言》第5、6章。
我感觉这两章主要加深了对于段这个概念的理解。
第5章[Bx]和loop指令,重点在于段地址和偏移地址的理解,段前缀的应用。
第6章包含多个段的程序,重点在于理解为什么要分段,掌握分段汇编程序的写法,搞清楚段在内存当中的存储。
1.loop指令和[bx]的应用
1.1 计算ffff:0~ffff:b单元中数据的和,并将结果保存在dx中?
存在的问题:8位的内存单元累加之和放到16位的寄存器中。
解决的方法:以ax为中介,其中ah设为0,al为内存单元的值。
mov ax,0ffffh里面,0和h一个都不能少。
assume cs:code
code segment
mov ax,0ffffh
mov ds,ax
mov ax,0
mov dx,0
mov bx,0
mov cx,12
s:mov al,[bx]
add dx,ax
inc bx
loop s
mov ax,4c00h
int 21h
code ends
end1.2 将内存ffff:0~ffff:b单元中的数据复制到0:200~0:20b中?
段前缀的应用,ds、cs、ss、es都可以使用,很灵活。
注意题目是,将内存ffff:0~ffff:b单元中的数据复制到0:200~0:20b单元中。将段前缀设置为0020h比0要方便。
mov ax,0ffffh
mov ds,ax
mov ax,0020h
mov es,ax
mov bx,0
mov cx,12
s: mov dl,[bx]
mov es:[bx],dl
inc bx
loop s2.包含多个段的程序
2.1 如何对数据进行累加?
即一些数据常量应该如何声明,如何引用?
采用dw 0123h,0456h,0789h进行声明。
通过cs:[bx]进行定位,bx每次增加2个字节。
但是仅仅只做这些改变,在运行时就会出现问题。先看一下程序的内存:

可以看出前6个字节存储的三个字的值,为避免将数据当作指令,程序应该从0C53:0006开始执行。
所以需要在源程序中用end标号,标记程序的入口地址。
2.2 利用栈,将程序中定义的数据逆向存放?
首先,提前声明一块空间,供栈使用。
另外,设置好栈的段地址和偏移地址。
示例程序如下:
assume cs:code
code segment
dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h
dd 0,0,0,0,0,0,0,0
start:mov ax,cs
mov ss,ax
mov sp,30h
mov bx,0
mov cx,8
s: push cs:[bx]
add bx,2
loop s
mov bx,0
mov cx,8
s1:pop cs:[bx]
add bx,2
loop s1
mov ax,4c00h
int 21h
code ends
end start2.3 结构更清晰——将代码分多个段
下面是之前提及的例子,不过分了数据、栈和代码三段。
需要注意的是:
1.在assume之后,CPU不会将CS指向code,不会将DS指向data,不会将SS指向stack。
2.end指明了程序的入口,这个入口将被写入可执行文件的描述信息。可执行文件中的程序被加载到内存之后,CPU的CS:IP被设置指向这个入口,开始执行程序中的第一条指令。
所以,CS的值不用在代码中设定,但是DS和SS的值需要在代码中进行说明。
3.对于一个段,如果段中的数据占N个字节,则程序加载后,该段实际占有的空间为:
(N/256+1)*256
其中除法取整。
assume cs:code,ds:data,ss:stack
data segment
dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h
data ends
stack segment
dw 0,0,0,0,0,0,0,0
stack ends
code segment
start: mov ax,stack
mov ss,ax
mov sp,20h
mov ax,data
mov ds,ax
mov bx,0
mov cx,8
s: push [bx]
add bx,2
loop s
mov bx,0
mov cx,8
s1: pop [bx]
add bx,2
loop s1
mov ax,4c00h
int 21h
code ends
end start自己通过调试,发现段在内存中的存储方式,是很有意思的一件事情。
不过更有意思的永远都在后面(手动滑稽)
边栏推荐
- 服务器被攻击了三次,还把我的数据库删除了,还想要我汇钱赎回数据
- From the Dutch flag problem to the optimization and upgrade of quick row
- pytest 之 fixture的调用
- C语言 猜数字游戏 (含代码并详细注释)
- vs怎么用一个Button链接到另一个页面
- typeorm 批量插入数据优化和插入冲突操作
- opencv-matchTemplate 之使用场景为大图里面找小图
- Jetpack Compose - Image using Coli load network Image (including GIF, SVG)
- flink并行度知识点
- 微信实现扫码支付(native)
猜你喜欢
随机推荐
The use of Jetpack Compose - Button (Button)
C#使用cersharp
分布式系统关注点(8)——99%的人都能看懂的「熔断」以及最佳实践 (转载非原创)
记一次 ERROR scheduler.AsyncEventQueue: Dropping event from queue shared导致OOM
Analysis of SEATA Distributed Transaction Framework
初中级常见面试题
系统可扩展性思考
Spark Sql之union
微信小程序getPhoneNumber接口code=40013
理解redis,一篇就够
markdown学习1
pytest 之 fixture的调用
12.cuBLAS开发指南中文版--cuBLAS中的Level-1函数asum()和axpy()
tkiner组件之滚动文本框(scrolledtext )相关操作
Zero Basic Learning CANoe Panel Design Catalog
探索快八年,谁挡住了小红书的电商梦?
Jetpack Compose——Button(按钮)的使用
机器学习web服务化实战:一次吐血的服务化之路 (转载非原创)
用asp.net基于C#编写简单登录注册界面(访问数据库)
使用 compose 的 Canvas 自定义绘制实现 LCD 显示数字效果









