当前位置:网站首页>汇编语言学习(二)
汇编语言学习(二)
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自己通过调试,发现段在内存中的存储方式,是很有意思的一件事情。
不过更有意思的永远都在后面(手动滑稽)
边栏推荐
猜你喜欢
随机推荐
11.cuBLAS开发指南中文版--cuBLAS中的Level-1函数amax()和amin()
ensp如何正确配置静态路由
Jetpack Compose - simply the basic attributes of Modifier is introduced
Jetpack Compose——Button(按钮)的使用
开源一夏│别逗,作为程序员你竟还没参与过开源项目?
Flex for openharmony container components
将 .json 格式 转换成 .xml格式
去IOE-EBS何去何从
Thinking about oracle financial data authority
ttemp
微信实现扫码支付(native)
Operating system migration practice deploying MySQL database on openEuler
曾毓群想做王传福
阿里云PAI与香港大学合作论文入选INFOCOM 2022,有效减少大规模神经网络训练时间
易语言获取cookie
pytest 之 fixture参数化
实现H5网页授权
图解LeetCode——1413. 逐步求和得到正数的最小值(难度:简单)
iptables防火墙
spark单机版安装








