您的位置:首页 > 其它

读书笔记-汇编

2010-03-10 14:40 393 查看
第一章 基础知识

1.1进制记数制与不同基数的数之间的转换
1.1.1二进制数
基数2
权2k
十进制 decimal
二进制 binary
八进制 octal
十六进制 hexadecimal
1.1.2二进制数和十进制数之间的转换
二进制转化为十进制
按权展开
十进制转化为二进制
整数:除基取余 小数:乘基取整
1.1.3十六进制数及其与二进制、十进制数之间的转换
1.2二进制数和十六进制数运算
1.2.1二进制数运算
1.2.2十六进制数运算
1.3计算机中数和字符的表示
1.3.1数的补码表示
机器数:把一个数连同其符号在内数值化表示的树称为机器数
一般用最高有效位来表示数的符号:
正数用0
负数用1
补码表示法:
正数采用符号-绝对值表示
负数采用2n - |x|来表示
(负数补码的表示:先写出与该负数相对应的正数的补码表示,然后按位求反在末位加1)
补码表示的符号扩展问题:
正书在前面补0 负数在前面补1
双精度数:为了扩大表数范围,可以用二个机器字来表示一个机器数,这种数称为双字长数或双精度数。
现在80x86机器字长为32位。为了统一起见,80x86系统仍称32位字为双字,这样又有了8个字节64位的4字。
一个字节8位。
0只有一种表示方法
1.3.2补码的加法和减法
求补:我们把这种对一个二进制数按位求反后在末位加1的运算称为求补运算。
[x]->(求补)[-x]->(求补)[x]
补码的加法减法:
[x+y]补 = [x]补 + [y]补
减法
[x-y]补 = [x]补 + [-y]补
1.3.3无符号整数
1.3.4字符表示
bell
line feed
carriage return
american standard code for information interchange
ASC 低7位为字符,最高位为校验位。
1.4几种基本的逻辑运算
1.4.1与运算(AND)
1.4.2或运算(OR)
1.4.3非运算(NOT)
1.4.4异或运算(XOR)
第二章 80x86计算机组织
2.180x86微型处理器
计算机主要由运算器、控制器、存储器、和输入输出设备构成。
2.2基于微处理器的计算机系统构成
2.2.1硬件
计算机结构:中央处理机、存储器、输入输出系统。
中央处理机包括运算器和控制器两部分。运算器执行多有的算术和逻辑运算指令,控制器则负责全机的控制工作,它负责把指令逐条从存储器中取出,经仪码分析后向全机发出取数、执行、存数等控制命令,以保证正确完成程序所要求的功能。
2.2.2软件
2.3中央处理机
2.3.1中央处理机cpu的组成
cpu的任务是执行存放在存贮器里的指令序列。
cpu中除高速缓冲存储器之外的组成,他们主要由以下三部分组成:
算术逻辑部件:用来进行算术和逻辑运算。
控制逻辑负责对全机的控制工作,包括从存储器取出指令,对指令进行译码分析,从存储器取得操作数,发出执行指令的多有命令,把结果存入存储器,以及对总线及i/o的传送控制等。
工作寄存器在计算机中起着重要的作用,没一个寄存器相当于运算器中的一个存储单元,但它的存取速度比存储器要快得多。它用来存放计算机过程中所需要的或所的到的各种信息,包括操作数地址、操作数及运算的中间结果等。
2.3.280x86寄存器组
寄存器分为程序可见的寄存器和程序不可见的寄存器。
程序可见的寄存器分为通用寄存器、专用寄存器、和段寄存器。
通用寄存器
AX、BX、CX、DX可称为数据寄存器,用来暂时存放计算过程中所用到的操作数、结果或其他信息。
这4个寄存器都是通用寄存器,但他们又可以用于各自的专用目的。
AX(accumulator)作为累加器用,所以它是算术运算的主要寄存器。在乘、除等指令中指定用来存放操作数。另外,所有的i/o指令都使用这一寄存器与外部设备传送信息。
BX(base)可以作为通用寄存器使用。此外在计算机存储地址时,他经常用作基址寄存器。
CX(count)可以作为通用寄存器使用。此外常用来保存记数值,如在移位指令、循环(loop)和串处理指令中用作隐含的计数器。
DX(data)可以作为通用寄存器使用,一般在作双字长运算时把DX和AX组合在一起存放一个双字长数,DX用来存放高位字。此外,对某些i/o操作,DX可以用来存放i/o的端口地址。
基址指针寄存器
SP(stack pointer)称为堆栈指针寄存器,用来指示段顶的偏移地址。
BP(base pointer)称为基址指针寄存器,它可以与堆栈段寄存器SS连用确定堆栈段中的某一存储单元的地址。可作为堆栈区中的一个基地址以便访问堆栈中的信息。
SI(source index)源变址寄存器与数据寄存器DS联用,用来确定数据段中某一存储单元的地址。有自动增量和自动
减量的功能。在串处理指令中,DS联用,达到在数据段中寻址的目的。
DI(destination index)目的变址寄存器与数据寄存器DS联用,用来确定数据段中某一存储单元的地址。有自动增量和自动
减量的功能。在串处理指令中,ES联用,达到在附加段中寻址的目的。
专用寄存器
IP(instruction pointer)指令指针寄存器,它用来存放代码段中的偏移地址。
SP
FLAGS(program status word)为标志寄存器,又称程序状态寄存器。这是一个存放条件码标志,控制标志和系统标志的寄存器。
段寄存器
CS(code segment)代码段
DS(data segment)数据段
SS(stack segment)堆栈段
ES(extra sement)附加段

2.4存储器
2.4.1存储单元的地址和内容
物理地址:每一个字节单元给以一个唯一的寄存器地址。
一个字存入存储器要占有相继的两个字节,存放时低位字节存入低地址,高位字节存入高地址。也就是说,是以相反的次序存入的。
这样2个字节单元就构成了一个字单元,字单元的地址采用它的低地址来表示。
2.4.2实模式存储器寻址
实模式下最大寻址空间为1MB。
机器规定:从0地址开始,每16个字节为一小段(paragraph)。
1MB的地址空间里,共有64k个小段的首地址,在1MB的存储器里,每一个存储单元都有一个唯一的20位地址,称为该存储单元的物理地址。
2.4.3保护模式存储器寻址
1。逻辑地址
2。描述符
2.5外部设备
习题:
1。在80X86微机的输入输出指令中,I/O端口号通常是由DX寄存器提供的,但是有时也可以在指令中直接指定00---FFH的端口号。试问,可直接由指令指定的I/0端口数~
解答: 有256个~~ 书上有原话~~可以找到~~
2。有两个16位字节1EE5H和2A3CH分别存放在80X86微机的存储器的000B0H和000B3H单元中,请用图表示出它们在存储器里的存放情况。
第一个络子为000B0H字单元,注意,是字单元~~第五个格子为000B3H字单元~
3. 图在书上,我就不画了,太麻烦~~直接答吧~
解答: 30022H字节单元内容: ABH 30024H字节单元内容: EFH
30021H字单元内容: AB34H 30022H字单元内容: CDABH
4.对了,看这个的人.,肯定都有那本书,所以,以后我就不抄题目哈~~~
解答: 这三个物理地址都是3017AH,正好 说明了不同的段地址和偏移地址对应同一物理地址~~
5.解答: CS+IP 第一个字的物理地址为: 0AAA40H
6.解答: 图,实在不知道怎么画,待我想办法~~ 条件标志OF,SF,ZF,CF,的值依次为:0,0,0,0
7。下列操作可使用那些寄存器?
(1)加法和减法 AX ,BX,CX,DX,当然,还有这几个通用寄存器的高低位了,如AH ,AL ,.等~~
(2)循环计数 CX
(3)乘法和除法 DX,AX,AH,AL
(4)保存段地址 CS ,DS,ES,SS
(5)表示运算结果为O FLAGS
(6)将要执行的指令地址 IP
(7) 将要从堆栈取出数据的地址 BP,SP,SS
8。可以用来指示存储器地址的寄存器有: BX,SP,BP,DI,CS,DS,SI,ES,SS,IP
9。一一对应;
5--A 4--B 2--C 3--D 12--E 9--F 11--G 10--H 13--I 8--J 7--K 6---L 1--M 15--N 14--O

第三章 80x86的指令系统和寻址方式
计算机是通过执行指令序列来解决问题的,因而每种计算机都有一组指令集供给用户使用,这组指令集就称为计算机的指令系统。
计算机中的指令由操作码字段和操作数字段两部分组成。
3.1 80x86的寻址方式
1.立即寻址方式(immediate addressing)
move al 5
2.寄存器寻址方式(register addressing)
有效地址:把操作数的偏移地址称为有效地址(effctive address,EA)
有效地址可以由以下四种成分组成:
(1)位移量(displacement)是存放在指令中的一个数(地址)。
(2)基址(basc)是存放在基址寄存器中的内容。
(3)变址(index)是存放在变址寄存器中的内容。
(4)比例因子(scale factor)
有效地址可以表示为:EA = 基址 + (变址*比例因子)+位移量
以下三种情况不允许使用段跨越前缀:
(1)串处理指令的目的串必须用ES段
(2)push指令的目的和pop指令的源必须用ss段
(3)指令必须存放在CS段中
3.直接寻址方式(direct addressing)
4.寄存器间接寻址方式(register indirect addressing)
5.寄存器相对寻址方式(register relative addressing)
6.基址变址寻址方式(based indexed addressing)
7.相对基址变址寻址方式(relative based indexed addressing)
8.比例变址寻址方式(scaled indexed addressing)
9.基址比例变址寻址方式(based scaled indexed addressing)
10.相对基址比例变址寻址方式(relative based scaled indexed addressing)
3.1.1与数据有关的寻址方式
3.1.2与转移地址有关的寻址方式
1。段内直接寻址(intrasegment direct addressing)
2。段内间接寻址(intrasegment indirect addressing)
3。段间直接寻址(intersegment direct addressing)
4。段间间接寻址(intersegment indirect addressing)
3.2程序占有的空间和执行时间
3.380x86的指令系统
3.3.1数据传送指令
1。通用数据传送指令
mov(move)
movsx(move with sign-extend)
movzx(move with zero-extend)
push(push onto the stack)
pop(pop from the stack)
pusha/pushad(push all registers)
popa/popad(pop all registers)
2。累加器专用传送指令
in(input)
out(output)
xlat(translate)
3。地址传送指令
lea(load effective address)
lds(load ds with pointer)
les(load es with pointer)
lfs(load fs with pointer)
lgs(load dgs with pointer)
lss(load ss with pointer)
4。标志寄存器传送指令
lahf(load ah with flags)
sahf(store ah into flags)
pushf/pushfd(push the flags or eflags)
popf/popfd(pop the flags or eflags)
5。类型转换指令
cbw(convert byte to word)
cwd.cwde(convert word to double word)
cdq(convert double to quad)
bswap(byte swap)
3.3.2算术指令
1。加法指令
add(add)
adc(add with carry)
inc(increment)
xadd(exchange and add)
2。减法指令
sub(subtract)
sbb(subtract with borrow)
dec(decrement)
neg(negate)
cmp(compare)
cmpxchg(compare and exchange)
cmpxchg8b(compare and exchange 8 byte)
3。乘法指令
mul(unsigned multiple)
imul(signed multiple)
4。除法指令
div(unsigned divide)
idiv(signed divide)
3.3.3逻辑指令
and(and)
or(or)
not(not)
xor(exclusive or)
test(test)
位测试并修改指令
bt(bit test)
bis(bit test and set)
btr(bit test and reset)
btc(bit test and complement)
位扫描指令
bsf(bit scan forward)
bsr(bit scan reverse)
移位指令
shl(shift logical left)
sal(shift arithmetic left)
shr(shift logical right)
sar(shift arithmetic right)
rol(rotat left)
ror(rotatc right)
rcl(rotate left through carry)
rcr(rotate right through carry)
rhld(shift left double)
shrd(shift right double)
3.3.4串处理指令
movs(move string)
cmps(compare string)
scas(scan string)
lods(load from string)
stos(store in to string)
ins(input from port to string)
outs(output string to port)
rep(repeat)
repe/repz(repeat while equal/not zero)
3.3.5控制转移指令
jmp(jmp)
loop(loop)
3.3.6处理机控制与杂项操作指令
课后习题答案
1。
.(1)立即寻址 没有
(2)直接寻址 7237H
(3)使用BX的寄存器寻址 没有
(4)使用BX的间接寻址 637DH
(5)使用BX的寄存器相对寻址 0D5F0H
(6) 基址变址寻址 8E18H
(7)相对基址变址 004FH
2。根据下列要求,写出相应的汇编指令。
(1)ADD DX,BX
(2) ADD AL,[BX][SI]
(3) ADD [BX][0B2H], CX
(4) MOV AX,2A59H ADD [0524H] ,AX
(5) ADD AL ,0B5H
3。
(1)寄存器间接寻址
MOV BX,OFFSET [BLOCK][0AH]
MOV DX ,[BX]
(2)寄存器相对寻址
MOV SI,OAH
MOV DX,[BLOCK][SI]
(3)基址变址寻址
MOV BX ,BLOCK
MOV SI,OAH
MOV DX,[BX][SI]
4。现有(DS)=2000H,(BX)=0100H,(SI)=0002H,(20100)=12H,(20101)=34H,(20102)=56H,(20103)=78H,(21200)=2AH,(20201)=4CH,(21202)=B7H,(21203)=65H,试说明下列各条指令执行完后,AX寄存器的内容。
(1)MOV AX,1200H 1200H
(2) MOV AX,BX 0100H
(3) MOV AX,[1200] 4C2AH 注意,是字单元!!
(4)MOV AX,[BX] 3412H 同上
(5)MOV 1100[BX] 4C2AH
(6) MOV AX,[BX][SI] 7856H
(7) MOV AX,1100[BX][SI] 65B7H
5。
(1) 7CD9H (2) 1200H (3) 6319H
6。 MOV BX,2000H
LES DI ,[BX]
MOV AX, ES:DI
7。转向地址OBJ的值分别为:(1)064DH (2)0691H (3)05E0H 注意有符号数的符号位~~
8。(1) MOV AX,0ABH 立即数寻址 无物理地址
(2)MOV AX,BX 寄存器寻址 同上
(3)MOV AX,[100] 直接寻址 20100H
(4)MOV AX,VAL 直接寻址 20050H
(5) MOV AX,[BX] 寄存器间接寻址 20100H
(6) MOV AX,ES:[BX] 直接寻址 21100H
(7) MOV AX,[BP] 寄存器间接寻址 20010H
(8)MOV AX,[SI] 同上 200A0H
(9) MOV AX,[BX+10] 寄存器相对寻址 20110H
(10)MOV AX,VAL[BX] 同上 20150H
(11) MOV AX,[BX][SI] 基址变址寻址 201A0H
(12) MOV AX,VAL[BX][SI] 相对基相变址寻址 201F0H
9。
(1)的指令: MOV AX, [BX][0CH] MOV ZREO ,AX
(2) 的指令: MOV AX,ARRAY[BX] MOV ZREO,AX
10。 MOV AX,TABLE 是把符号地址TABLE里的内容送到AX里,指令执行完后,(AX)=1234H
LEA AX,TABLE 是把符号地址TABLE 的有效地址(这里是偏移量)送到指定寄存器AX里,指
令执行完后,(AX)=0032H
11。执行完指令后,(AX)=1E00H
12。 LEA AX,CSTRING
MOV DL,AX
MOV DH,[AX+6]
13。这个,,图,很麻烦了,所以就不画了~~大家可以看一下课本上P51--P53,很清楚,看完了这道韪也会了~~~
14。LES BX,[2000]
MOV AX,ES:[BX]
注意:一开始我写的是: MOV AX,ES:[8000H],后来看到题目里要求写两条指令,所以一条就不行了,就要画蛇添足~~~
15。 运算结果 SF,ZF,CF,OF各位的值(从左至右依次往下~)
(1) 74D4H 0 0 0 0
(2) A5C1H 1 0 0 1
(3) 4240 H 0 0 1 0
(4) 0000 H 0 1 1 0
16。 接上表~
(1) 5D14 0 0 0 0
(2) A870 1 0 0 1
(3) D870 1 0 0 0
(4) 34E4 0 0 1 0
17。
(1).MOV AX,Z ;把Z送到AX
SUB AX,X ;Z-X
ADD AX,W ;W+(Z-X)
MOV Z,AX ;结果保存在Z中
(2). MOV AX,R ;R送到AX中
ADD AX,9 ;R+9
MOV BX,X ;X送到BX中
ADD BX,6 ;X+6
ADD AX,BX ;(R+9)+(X+6),结果保存在AX中
MOV BX,W ; W送到BX中
SUB BX,AX ; W-(R+9)-(X+6),连续减去两个数,相当于减去这两个数的和~~
MOV Z,BX ;最终结果送到Z中
-3
MOV AX,W ;把W送到AX
IMUL X ;W*X 注意:低十六位保存在AX里,高十六位保存在DX里
MOV BX,Y ;把Y送到BX 里
ADD BX,6 ;Y+6
IDIV BX ;(W*X)/(Y+6) 注意:商保存在AX里,余数保存在DX里
MOV Z,AX ;把商送到Z中,
MOV R,DX ;把余数 送到R中
-4
MOV AX,W ;把W送到AX中
SUB AX,X ;W-X
CWD ;把AX中的十六位带符号数扩展成为32位,低十六位保存在AX中,高十六位保
;在DX中
MOV BX,5 ;把5送到BX中
IDIV BX ;(W-X)/5 被除数为32位,除数为16位 商为16位
IMUL Y ;上一步结果再乖以Y,积为32位
MOV BX,2 ;把2送到BX中
IMUL BX ;上一步乘法所得的积再乘以2,各为64位
MOV Z,EAX ;把结果中低32位放入Z双字单元中
MOV [Z+4],EDX ;把结果中高32位放入Z+4双字单元中
18。
指令 本条指令执行完后AX的内容 执行完后CF,SF,ZF的值
MOV AX,1234H 1234H 0 0 0
MOV CL,4 1234H 0 0 0
ROL AX,CL 2341H 1 0 0
DEC AX 2340H 1 0 0
MOV CX,4 2340H 1 0 0
MUL CX 8918H 0 0 0
INT 20H
程序结束后,(AX)=8918H (DX)=0000H
19。
指令 执行完后AX的内容 执行完后CF ,SF,ZF和OF的值
MOV AX,0 0 0010
DEC AX FFFFH 0100
ADD AX,7FFFH 7FFEH 0000
ADD AX,2 8000H 0101
NOT AX 7FFFH 0101
SUB AX,0FFFFH 8000H 1101
ADD AX,8000H 0000H 1011
SUB AX,1 FFFFH 1101
AND AX,58D1H 58D1H 0000
SAL AX,1 B1A2H 0101
SAR AX,1 D8D1H 0100
NEG AX 272FH 1000
ROR AX,1 9397H 1001
20。
(1)MOV AX,DATAX
ADD DATAY,AX
(2)MOV AX,DATAX
ADD DATAY,AX
MOV AX,[DATAX+2]
ADD [DATAY+2] ,AX
(3)本組指令的作用是:BX <------[DATAX]+[DATAY]+[1](CF的值) 帶進位加法~
(4)MOV AX,DATAX
MUL DATAY ;結果的高十六位保存在DX裏,低十六位保存在AX裏
(5)MOV AX,DATAX
MOV DX,[DATAX+2]
MUL DWORD DATAY ;結果的高三十二位保存在EDX裏,低三十二位保存在EAX裏
;這裏所用的DWORD為一屬性操作符,在第四章會學到~~
(6)MOV AX,DATAX
DIV 17H ;結果商保存在AL中,余數在AH中
(7)MOV AX,DATAX
CDW
DIV DATAY
21。NEG DX
NEG AX
SBB DX,0
22。
MOV AX,A ;把雙字長數的低字放到AX中
MOV DX,[A+2] ;把雙字長數的高字放到DX中
TEST DX,8000H ;測試雙字長數的符號
JZ RIGHT ;如果是非負數,則直接保存
NEG DX ;如果是負數,則求補
NEG AX
SBB DX,0
RIGHT: MOV B ,AX
MOV [B+2],DX
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: