汇编的考试题目
- 填空
- 简答
- 读程序
- 手写程序
数制转换
一些常识
-
1K=1024=210
-
1M=1024K=220
-
1G=1024M=230
-
1T=1024G=240
-
一个二进制位:bit(比特)
-
8个二进制位:byte(字节),1byte=8bit
-
2个字节:word(字)
-
1 word=2 byte =16bit
数的表示
重点是带符号数的表示
- 无符号数:字长的全部有效位数均用来表示数值
- 有符号数:字的最高为表示符号**(0表示正数,1表示复数)**,其他位数表示该数的绝对值
物理地址
8086 存储器编址
8086有20跟地址线,因此具有220=1MB的存储器地址空间,这1MB的内存单元按 00000~FFFFFH来编址。
但是,8086的内部寄存器包括指令指针和堆栈指针都是16位的,显然用寄存器不能直接对1MB的内存空间进行寻址,为此引入了分段的概念。8086 系统的一个段最长为64KB。在通常的程序设计中,一个程序可以有代码段、数据段、堆栈段和附加段,各段的段地址分别由:
CS(code segment)
DS(data segment)
SS(stack segment)
ES(extra segment)
这四个段寄存器给出。
段寄存器都是16位的。要计算一个存储单元的物理地址,先要将它对应的段寄存器的16位值左移四位(相当于乘十进制数16),得到一个20位的值,再加上16位的偏移量。
物理地址 = 段地址 + 偏移地址 = 段寄存器值 × 10h(左移四位 / 16d)+ 偏移地址
一个例题
指出红体
部分的寻址方式(参见 8086寻址方式),计算其物理地址
已知:
(cs)=3100h,(ds)=3300h,(es)=3400h,(ss)3600h
(bx)=1600h,(di)=100h,(si)=200h,(bp)=300h,
count=3456h
- mov cl,
[bx+si]
- cmp si,
ss:[di]
- add ax,
count [bp][si]
- call
word ptr [si]
- lea dx,
es:[1500h]
解答:
序号 | 寻址方式 | 物理地址 |
---|---|---|
1 | 基址加变址的寻址 | (默认ds段寄存器) 3300 h ∗ 10 h + ( 1600 h + 200 h ) = 33000 h + 1800 h = 34800 h 3300h*10h+(1600h+200h)=33000h+1800h=34800h 3300h∗10h+(1600h+200h)=33000h+1800h=34800hc |
2 | 寄存器间接寻址(指定段寄存器) | (指定ss段寄存器) 3600 h ∗ 10 h + 100 h = 37100 h 3600h*10h+100h=37100h 3600h∗10h+100h=37100h |
3 | 基址加变址的寻址 | (利用bp间接寻址,因而默认段为ss) 3600 h ∗ 10 h + 3456 h + 300 h + 200 h = 39956 h 3600h*10h+3456h+300h+200h=39956h 3600h∗10h+3456h+300h+200h=39956h |
4 | 寄存器间接寻址 | (因为是call,因而默认段为cs) 3100 h ∗ 10 h + 200 h = 31200 h 3100h*10h+200h=31200h 3100h∗10h+200h=31200h |
5 | 指定段寄存器的直接寻址 | (指定es寄存器) 3400 h ∗ 10 h + 1500 h = 35500 h 3400h*10h+1500h=35500h 3400h∗10h+1500h=35500h |
要注意的是:
- 用bp,sp,ebp和esp进行间接寻址时,默认段为ss,
- 用其他寄存器进行间接寻址时,默认段为ds。
- 出现call,默认cs寄存器