Pwn

汇编语言(王爽)练习题

Posted on 2020-01-02,5 min read

内存中的字存储
CPU中,用16位寄存器存储一个字,高8位存放高位字节,低8位存放地位字节,
内存单元是字节单元,一个单元存放一个字节,一个字要用两个连续地址的内存单元存放
如下:

mov ax,4E20H
对应内存中的存储
0   20H     
1   4EH     
0和1表示两个内存单元,存储一个字,这两个单元是一个起始地址为0的字单元
0是低单元,1是高单元,从上而下变大,1对应4E20H的高地址4E,0对应低地址20

2   12H     
3   00H     
同理,将2、3内存单元看作一个字单元,起始地址为2,存放数据,高位00,低位12,存放的数据就是0012H

问题:

0地址单元中存放的字节型数据是多少?
0地址单元是由0内存单元组成,搭建就是单纯的0上面的数据,20H
0地址字单元中存放的字型数据是多少?
0地址字单元,字单元是两个内存单元组合的,所以数据为4E20H
2地址单元中存放的字节型数据是多少?
2地址单元=2内存单元,对应12H
2地址字单元中存放的字型数据是多少?
2字单元=2个内存单元组合=0012H
1地址字单元中存放的字符型数据是多少?
1地址=1号内存单元和2号内存单元组成,低位放在1,高位放在2,1是4E,2是12=124EH

DS和address
cpu读写一个内存单元的时候,必须先给出内存单元的地址,而内存单元的地址又由段地址和偏移地址组成
8086CPU中有DS寄存器,是用来放数据的段地址
比如我们 要读取10000H单元 的内容,用以下程序进行

mov xb,1000H    
#读10000H地址,而这段地址只填1000H,因为段地址*10+偏移地址(假设为0)就是内存地址
mov ds,bx       
#将bx(段地址1000H)移动到ds(段地址寄存器)中,ds中的值为1000H
mov al,[0]
#将内存地址的0字单元移动到ax的低地址(al),[0]表示段地址的偏移值,现在读取的就是1000H的0和1两个内存单元,两个为一组哦
mov bx,1000H
#将1000H移动到bx中
mov ds,bx
#将bx(段地址1000H)放入ds(段地址寄存器)

题目:

用汇编代码将寄存器送入内存单元
mov ax,1000H
#ax中存放1000H
mov bs,ax
#将ax中的地址存放到bs中
mov [0],bl
#将bx低位地址中的数据存放到1000H中的0和1内存单元

字的传输

mov bx,1000H
#将1000H放入bx
mov ds,bx
#将bx中的1000H移动到ds寄存器
mov ax,[0]
#将1000H:0偏移的数据放入ax
mov [0],cx
#将cx中的数据,放入1000H:0偏移的字单元
分析以下内存变化
mov ax,1000H
mov ds,ax                                              ------
mov ax,[0]                                       10000H| 23  |
mov bx,[2]                                       10001H| 11  |
mov cx,[1]                                       10002H| 22  |
add bx,[1]                                       10004H| 66  |
add cx,[2]                                              ------

mov ax,1000H
mov ds,ax   
#作用是将ds设为1000H
mov ax,[0]
#1000H:0偏移,表示10000H地址0和1内存单元(0字单元)移动到ax=1123H
mov bx,[2]
#1000H,2偏移,表示10000H地址2和3内存单元(2字单元)移动到bx=6622H
mov cx,[1]
#1000H,1偏移,表示10000H地址1和2内存单元(1字单元)移动到cx=2211H
add bx,[1]
#1000H:1偏移,10000H地址1和2内存单元,增加到bx=6622H+2211H=8833H
add cx,[2]
#1000H,2偏移,10000H地址2和3内存单元,增加到cx=2211H+6622H=8833H

思考下列内存变化

mov ax,1000H                    
mov ds,ax                                       ——————
mov ax,11316                              10000H| 23 |
mov [0],ax                                10001H| 11 |
mov bx,[0]                                10002H| 22 | 
sub bx,[2]                                10003H| 11 |
mov [2],bx                                      ——————

mov ax,1000H
mov ds,ax
#将ds寄存器设置为1000H
mov ax,11316
mov [0],ax
#11316转换为16进制为2C34H,存放到1000H:0偏移地址,10000H结果为34,100001H结果为2C
mov bx,[0]
sub xb,[2]
#将1000H:0偏移的数据存放到bx,bx=2C34H,将xb减去1000H:2偏移的数据,2C34H-1122H=1B12H
mov [2],bx
#将bx的数据存放到1000H:2偏移,10002H结果为12,100003H结果为1B
最后内存如下
10000H  34
10001H  2C
10002H  12
10003H  1B

下一篇: C语言整数类型→