为什么inc指令不影响 标志进位标志CF。 如果操作数是0FFH,不是进1了吗?

第3章 习题参考***_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
第3章 习题参考***
上传于||文档简介
&&单​片​机​基​础​试​题​及​答​案
阅读已结束,如果下载本文需要使用0下载券
想免费下载更多文档?
定制HR最喜欢的简历
你可能喜欢第3章_通用数据处理指令习题***_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
第3章_通用数据处理指令习题***
上传于||文档简介
&&3位​汇​编​语​言​程​序​设​计​,​第章​参​考​答​案
阅读已结束,如果下载本文需要使用1下载券
想免费下载本文?
定制HR最喜欢的简历
下载文档到电脑,查找使用更方便
还剩9页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢37汇编语言程序设计(第四版)第2章【课后***】_汇编语言程序设计***-牛宝宝文章网
37汇编语言程序设计(第四版)第2章【课后***】 汇编语言程序设计***
汇编语言程序设计
第四版【课后习题***】
--囮裑為檤第2章 8086的指令系统〔习题2.1〕已知DS=2000H、BX=0100H、SI=0002H,存储单元[20100H]~[20103H]依次存放12 34 56 78H,[21200H]~[21203H]依次存放2A 4C B7 65H,说明下列每条指令执行完后AX寄存器的内容。(1) mov ax,1200h(2) mov ax,bx(3) mov ax,[1200h](4) mov ax,[bx](5) mov ax,[bx+1100h](6) mov ax,[bx+si](7) mov ax,[bx][si+1100h]〔解答〕(1)AX=1200H(2)AX=0100H(3)AX=4C2AH偏移地址=bx=0100h(4)AX=3412H偏移地址=bx=0100h(5)AX=4C2AH偏移地址=bx+h(6)AX=7856H偏移地址=bx+si=h=0102h(7)AX=65B7H偏移地址=bx+si+h+h=1202h〔习题2.2〕指出下列指令的错误(1) mov cx,dl(2) mov ip,ax(3) mov es,1234h(4) mov es,ds(5) mov al,300(6) mov [sp],ax(7) mov ax,bx+di(8) mov 20h,ah〔解答〕(1)两操作数类型不匹配(2)IP指令指针禁止用户访问(3)立即数不允许传给段寄存器(4)段寄存器之间不允许传送(5)两操作数类型不匹配(6)目的操作数应为[ SI ](7)源操作数应为 [BX+DI](8)立即数不能作目的操作数〔习题2.3〕已知数字0 ~ 9对应的格雷码依次为:18H、34H、05H、06H、09H、0AH、0CH、11H、12H、14H,它存在于以table为首地址(设为200H)的连续区域中。请为如下程序段的每条指令加上注释,说明每条指令的功能和执行结果。lea bx,tablemov al,8xlat〔解答〕lea bx,table
;获取table的首地址,BX=200Hmov al,8
;传送欲转换的数字,AL=8xlat
;转换为格雷码,AL=12H
P35〔习题2.4〕什么是堆栈,它的工作原则是什么,它的基本操作有哪两个,对应哪两种指令?〔解答〕堆栈是一种按“先进后出”原则存取数据的存储区域,位于堆栈段中,使用SS段寄存器记录其段地址;它的工作原则是先进后出;堆栈的两种基本操作是压栈和出栈,对应的指令是PUSH和POP。〔习题2.5〕已知SS = 2200H、SP = 00B0H,画图说明执行下面指令序列时,堆栈区和SP的内容如何变化?mov ax,8057hpush axmov ax,0f79hpush axpop bxpop [bx]〔解答〕mov ax,8057hpush axmov ax,0f79hpush axpobx=0f79hpop [bx];DS:[0f79h]=8057h〔习题2.6〕给出下列各条指令执行后AL值,以及CF、ZF、SF、OF和PF的状态:mov al,89hadd al,aladd al,9dhcmp al,0bchsub al,aldec alinc al〔解答〕mov al,89 AL=89h
PFadd al, AL=12h
1; +add al,9dh; + cmp al,0bch; -* sub al,aldec al; - *inc al;+* AL=0afh
1 ; AL=0afh
1 ; AL=00h
1〔习题2.7〕设X、Y、Z均为双字数据,分别存放在地址为X、X+2;Y、Y+2;Z、Z+2的存储单元中,它们的运算结果存入W单元。阅读如下程序段,给出运算公式。mov ax,Xmov dx,X+2add ax,Yadc dx,Y+2add ax,24adc dx,0sub ax,Zsbb dx,Z+2mov W,axmov W+2,dx〔解答〕W=X+Y+24-Z〔习题2.8〕请分别用一条汇编语言指令完成如下功能:(1)把BX寄存器和DX寄存器的内容相加,结果存入DX寄存器。(2)用寄存器BX和SI的基址变址寻址方式把存储器的一个字节与AL寄存器的内容相加,并把结果送到AL中。(3)用BX和位移量0B2H的寄存器相对寻址方式把存储器中的一个字和CX寄存器的内容相加,并把结果送回存储器中。(4)用位移量为0520H的直接寻址方式把存储器中的一个字与数3412H相加,并把结果送回该存储单元中。(5)把数0A0H与AL寄存器的内容相加,并把结果送回AL中。〔解答〕(1)ADD DX,BX(2)ADD AL,[BX+SI](3)ADD [BX+0B2H],CX37汇编语言程序设计(第四版)第2章【课后***】_汇编语言程序设计***(4)ADD WORD PTR [0520H],3412H(5)ADD AL,0A0H〔习题2.9〕设X、Y、Z、V均为16位带符号数,分别装在X、Y、Z、V存储单元中,阅读如下程序段,得出它的运算公式,并说明运算结果存于何处。mov ax,Xax=Ximul YDX.AX=X*Ymov cx,cx=X*Y的低16位mox bx,bx=X*Y的高16位mov ax,Zax=Zcwdadd cx,cx=Z的低16位+X*Y的低16位adc bx,bx=Z的高16位+X*Y的高16位+低位进位sub cx,540cx=Z的低16位+X*Y的低16位-540sbb bx,0bx=Z的高16位+X*Y的高16位+低位进位-低位借位mov ax,Vax=Vcwdsub ax,ax=V的低16位-(Z的低16位+X*Y的低16位-540)sbb dx,dx=V的高16位-(Z的高16位+X*Y的高16位+低位进位-低位借位)-低位借位idiv X ;/X〔解答〕[V-(X*Y+Z-540)]/XAX存商,DX存余数〔习题2.10〕指出下列指令的错误:(1) xchg [si],30h(2) pop cs(3) sub [si],[di](4) push ah(5) adc ax,ds(6) add [si],80h(7) in al,3fch(8) out dx,ah〔解答〕(1)xchg的操作数不能是立即数(2)不应对CS直接赋值(3)两个操作数不能都是存储单元(4)堆栈的操作数不能是字节量(5)adc的操作数不能是段寄存器(6)没有确定是字节还是字操作(7)in不支持超过FFH的直接寻址(8)out只能以AL/AX为源操作数〔习题2.11〕给出下列各条指令执行后的结果,以及状态标志CF、OF、SF、ZF、PF的状态。mov ax,1470hand ax,axor ax,axxor ax,axnot axtest ax,0f0f0h〔解答〕mov ax,1470h
;AX=1470H CF
PFand ax,ax
;AX=1470H 0
0;11 0000or ax,ax
;AX=1470H 0
0xor ax,ax
;AX=0000H 0
;AX=FFFFH 0
1test ax,0f0f0h
;AX=FFFFH 0
1注意:MOV和NOT指令不影响标志位;其他逻辑指令使CF=OF=0,根据结果影响其他标志位。〔习题2.12〕假设例题2.34的程序段中,AX = 08H,BX = 10H,请说明每条指令执行后的结果和各个标志位的状态。〔解答〕指令 执行结果
CF OF SF ZF PFmov si, SI=AX=0008H
-shl si,1 SI=2*AX=0010H
0add si, SI=3*AX=0018H
1mov dx, DX=BX=0010H
1mov cl,03 CL=03H
1shl dx, DX=8*BX=0080H
0sub dx, DX=7*BX=0070H
0add dx, DX=7*BX+3*AX=0088H
1注意:逻辑左移N次相当于无符号整数乘以2的N次方,逻辑右移N次相当于无符号整数除以2的N次方。移位指令根据移位的数据设置CF,根据移位后的结果影响SF,ZF,PF。在进行一位移位时,根据最高符号位是否改变设置OF,如改变则OF=1。另外,程序注释用“u”表示标志无定义(不确定),“-”表示无影响。〔习题2.13〕编写程序段完成如下要求:(1)用位操作指令实现AL(无符号数)乘以10(2)用逻辑运算指令实现数字0 ~ 9的ASCII码与非压缩BCD码的互相转换(3)把DX.AX中的双字右移4位〔解答〕(1) ;不考虑进位mov bl,almov cl,3shl al,*8add al,shl bl,1add al,bl;考虑进位xor ah,ahmov bx,axmov cl,3shl ax,cladd ax,shl bx,1add ax,bx(2)数字0~9的ASCII码是:30h~39h非压缩BCD码的0~9是:00h~09h方法一:and al,0实现ASCII到非压缩BCD码的转换or al,30实现非压缩BCD码到ASCII的转换方法二:xor al,30h
;求反D5D4位,其他不变;即高4位为3,则变为0;高4位为0,则变为3(3)
mov cl,4again:
shr dx,1实现逻辑右移;采用“sar dx,1”,则实现算术右移rcr ax,1dec cljnz again〔习题2.14〕已知AL = F7H(表示有符号数-9),分别编写用SAR和IDIV指令实现的除以2的程序段,并说明各自执行后,所得的商是什么?〔解答〕(1)用sar编写mov al,0f7 -9送AL sar al,1 结果:AL=B=0FBH
即-5(2)用idiv编写mov al,0f7 -9送alcb 字节符号扩展位字mov bl,2 注意除数不可为立即数id 结果:商为al=fch
(-4); 余数:ah=ffh (-1)结论:符号数的除法用idiv 准确。〔习题2.15〕指令指针IP是通用寄存器还是专用寄存器?有指令能够直接它赋值吗?哪类指令的执行会改变它的值?〔解答〕指令指针IP不是通用寄存器,不可直接赋值,属于专用寄存器。有且仅有循环、转移、子程序调用和返回、中断类等指令可以改变它的值。〔习题2.16〕控制转移类指令中有哪三种寻址方式?〔解答〕控制转移类指令的寻址方式:相对寻址、直接寻址方式和间接寻址方式(又可以分成寄存器和存储器间接寻址)。〔习题2.17〕什么是短转移short jump、近转移near jump和远转移far jump?什么是段内转移和段间转移?8086有哪些指令可以实现段间转移?〔解答〕短转移:指段内-128~127之间的转移,位移量用一个字节表示近转移:指段内±32K之间的转移,位移量用一个字表示远转移:指段间1MB范围的转移段内转移:指在同一个代码段内的转移,可以是短转移或者近转移段间转移:指转移到另外一个代码段,就是远转移CPU的JMP、CALL和INT n指令可以实现段间转移〔习题2.18〕8086的条件转移指令的转移范围有多大?实际编程时,你如何处理超出范围的条件转移?〔解答〕8086的条件转移的转移范围:在当前指令地址的 +127~-128之内。如条件转移的转移范围超出此范围,可在此范围内安排一条无条件转移,再转移到范围外的目标地址。〔习题2.19〕假设DS=2000H,BX=1256H,SI=528FH,位移量TABLE=20A1H,[232F7H]=3280H,[264E5H]=2450H,试问执行下列段内间接寻址的转移指令后,转移的有效地址是什么?(1) JMP BX37汇编语言程序设计(第四版)第2章【课后***】_汇编语言程序设计***(2) JMP TABLE[BX](3) JMP [BX][SI]〔解答〕(1)转移的有效地址EA= BX=1256H(2)转移的有效地址EA= [DS:20A1H+1256H]=[232F7]=3280H(3)转移的有效地址EA= [DS:FH]=264E5H=2450H〔习题2.20〕判断下列程序段跳转的条件(1) xor ax,1e1ehje equal(2)test al,bjnz there(3)cmp cx,64hjb there〔解答〕(1)AX=1e1eh(异或后为0)(2)AL的D0或D7至少有一位为1(3)CX(无符号数)< 64h〔习题2.21〕设置CX = 0,则LOOP指令将循环多少次?例如:mov cx,0delay:
loop delay〔解答〕216次。〔习题2.22〕假设AX和SI存放的是有符号数,DX和DI存放的是无符号数,请用比较指令和条件转移指令实现以下判断:(1)若DX & DI,转到above执行;(2)若AX & SI,转到greater执行;(3)若CX = 0,转到zero执行;(4)若AX-SI产生溢出,转到overflow执行;(5)若SI≤AX,转到less_eq执行;(6)若DI≤DX,转到below_eq执行。〔解答〕(1)若DX & DI,转到above执行cmp dx,dija above
;=jnbe above(2)若AX & SI,转到greater执行cmp ax,sijg greater
;=jnle greater(3)若CX = 0,转到zero执行cmp cx,0jz= jcxz zero(4)若AX-SI产生溢出,转到overflow执行;cmp ax,sijo overflow(5)若SI≤AX,转到less_eq执行;cmp si, cmp ax,sijle less_ jge less_eq(6)若DI≤DX,转到below_eq执行。cmp di, cmp dx,dijbe below_ jae below_eq〔习题2.23〕有一个首地址为array的20个字的数组,说明下列程序段的功能。mov cx,20mov ax,0mov si,axsum_loop:
add ax,array[si]add si,2loop sum_loopmov total,ax〔解答〕将首地址为array得20个字的数组求和,并将结果存入 total 单元中。〔习题2.24〕按照下列要求,编写相应的程序段:(1)起始地址为string的主存单元中存放有一个字符串(长度大于6),把该字符串中的第1个和第6个字符(字节量)传送给DX寄存器。(2)从主存buffer开始的4个字节中保存了4个非压缩BCD码,现按低(高)地址对低(高)位的原则,将它们合并到DX中。(3)编写一个程序段,在DX高4位全为0时,使AX = 0;否则使AX = -1。(4)有两个64位数值,按“小端方式”存放在两个缓冲区buffer1和buffer2中,编写程序段完成buffer1-buffer2功能。(5)假设从B800h : 0开始存放有100个16位无符号数,编程求它们的和,并把32位的和保存在DX.AX中。(6)已知字符串string包含有32KB内容,将其中的?$?符号替换成空格。(7)有一个100个字节元素的数组,其首地址为array,将每个元素减1(不考虑溢出)存于原处。(8)统计以 ?$? 结尾的字符串srting的字符个数。〔解答〕(1)解答:mov si,0mov dl,string[si]
;第1个字符送dl寄存器:mov dl,stirng[0]mov si,5mov dh,string[si]
;第6个字符送dh寄存器:mov dl,stirng[5](2)解答:xor si,si
;si清零mov al,buffer[si]
;第一字节inc simov ah,buffer[si]
;第二字节mov cl,4shl ah,cl
;BCD码移到高半字节or al,ah
;组合成压缩BCD码mov dl,al
;存入dl寄..inc simov al,buffer[si]
;第三字节inc simov ah,buffer[si]
;第四字节mov cl,4shl ah,cl
;BCD码移到高半字节or al,ah
;组合成压缩BCD码mov dh,al
;存入dh寄..(3)解答:test dx,0f000 test dh,0f0hjz jnz nextmov ax,-1 mov ax,0jmp againnext:
mov ax,0 mov ax,0ffffhagain:
...(4)解答:mov ax, word ptr buffer1sub ax, word ptr buffer2
;先减低16位mov dx, word ptr buffer1+2sbb dx, word ptr buffer2+2
;后减高16位,需减低16位的借位(5)解答:mov ax,0b800hmov ds,ax
;段地址xor si,si
;地址偏移量si=0xor dx,dx
;和的高字dx=0mov cx,99
;加的次数mov ax,[si]
;第一个数again:
;指向下一个字单元inc siadd ax,[si]
;加下一个数jnc
;无进位转inc dx
;有进位dx=dx+1noc:
;次数-1jnz cx,again
;非0继续加(6)解答1:不使用串操作指令(更好)
mov si,offset stringmov cx,^15=8000hagain:
cmp byte ptr [si], ?$??$? =24hjnz ne 不要采用 jz 进行分支mov byte ptr [si], ?
?? ?=20hnext:
inc siloop a dec cx; jnz again(6)解答2:使用串操作指令mov di,offset stringmov al,?$?mov cx,8000hcldagain:
scasbjnz nextmov byte ptr es : [di-1], ?
loop again(7)解答1:mov si,offset arraymov cx,100again:
dec byte ptr [si]inc siloop again(7)解答2:xor si, si&--037汇编语言程序设计(第四版)第2章【课后***】_汇编语言程序设计***mov cx,100 循环次数again:
dec array[si]inc siloop again(7)解答3:mov si,offset arraymov di,simov ax,dsmov es,axmov cx,100cldagain:
lodsbdec alstosbloop again(8)解答:xor si,si&--0coun:
cmp string[si],'$'je
doneinc sijmp coundone:
...〔习题2.25〕对下面要求,分别给出3种方法,每种方法只用一条指令。(1)使CF=0
(2)使AX=0
(3)同时使AX=0和CF=0〔解答〕(1)解答:clcand ax,axor ax,ax(2)解答:xor ax,axand ax,0mov ax,0(3)解答:and ax,0xor ax,axsub ax,ax〔习题2.26〕参照本习题的示意图,分析调用序列,画出每次调用及返回时的堆栈状态。其中CALL前是该指令所在的逻辑地址;另外,段内直接调用指令的机器代码的字节数为3,段间直接调用指令则为5个字节。〔解答〕主程序转子suba时段内调用:断点1为2000h:0400h+3,转子是只将IP压栈。suba转子subb时段间调用:断点2为2000h:0840h+5, 转子时须将cs段地址和IP压栈suba转子subc时段内调用:断点3为2000h:0c021h+3,转子是只将IP压栈。注:压栈时先修改sp再压入断点,弹栈时先弹出断点再修改sp。〔习题2.27〕已知AX 、BX存放的是4位压缩BCD表示的十进制数,请说明如下子程序的功能和出口参数。add al,bldaaxchg al,ahadc al,bhdaaxchg al,ahret〔解答〕压缩BCD码加法:AX←AX+BX出口参数:AX=BCD码和〔习题2.28〕AAD指令是用于除法指令之前,进行非压缩BCD码调整的。实际上,处理器的调整过程是:AL←AH×10+AL,AH←0。如果指令系统没有AAD指令,请用一个子程序完成这个调整工作。〔解答〕shl ah,1ah=2*a
(设原ah=a)mov dl,dl=2*amov cl,2设定移位次数shl ah,ah=8*aadd ah,ah=10*aadd al,al=10*a+alxor ah,清零ahint 3返回DOS注意: 入口:AX中存放有“和”(两非压缩BCD码)出口:AL中 已为调整后的二进制数〔习题2.29〕解释如下有关中断的概念:(1) 内部中断和外部中断(2) 单步中断和断点中断(3) 除法错中断和溢出中断(4) 中断向量号和中断向量表〔解答〕(1)内部中断是由于8086CPU内部执行程序引起的程序中断;外部中断是来自8086CPU之外的原因引起的程序中断;(2)单步中断是若单步标志TF为1,则在每条指令执行结束后产生的中断;断点中断是供调试程序使用的,它的中断类型号为3通常调试程序时,把程序按程序的任务分成几段,然后,每段设一个段点;(3)除法错中断是在执行除法指令时,若除数为0或商超过了寄存器所能表达的范围产生的中断;溢出中断是在执行溢出中断指令INTO时,若溢出标志OF为1时产生的中断;(4)中断向量号是 中断类型号;中断向量表是中断向量号与它所对应的中断服务程序起始地址的转换表。〔习题2.30〕试比较INT n和段间CALL指令、IRET和段间RET指令的功能。〔解答〕INT n 响应中断时,除象CALL保护断点外,还应保护FR;段间CALL指令用在主程序中实现子程序的调用。IRET 返回时,除象RET恢复断点外,还应恢复FR;子程序执行完成后,应返回主程序中继续执行,这一功能由RET指令完成。欢迎您转载分享:
更多精彩:intel 汇编语言程序设计(第四版)习题解答
标 题:intel 汇编语言程序设计(第四版)习题解答
作 者:ukyohy
时 间: 1.汇编编译器和链接器是如何协同工作的?
&&&&&汇编编译器将汇编语言转换成机器语言,汇编编译器也可以生成源代码列表文件,包括行号,内存地址,源代码语句,程序中使用的符号及变量的交叉引用列表,
&&&&&链接器把编译器创建的多个文件合并链接成可运行程序。
&&&2.学习汇编语言会在哪些地方增强你对操作系统的理解?(***不明确)
&&&&&熟悉计算机体系结构&
&&&&&基本的布尔逻辑概念以及如何应用于程序设计和硬件设计&
&&&&&IA-32如何管理内存,如果使用保护模式,实模式以及虚拟模式&
&&&&&高级语言编译器如何将高级语言翻译成汇编和机器语言。&
&&&&&高级语言如何在机器语言层次实现算术表达式,循环和逻辑结构。&
&&&&&数据的表示方式,包括有符号和无符号整数,实数以及字符数据&
&&&&&机器语言的调试技巧会提高&
&&&&&了解程序是如何通过中断服务程序,系统调用,共享内存区与操作系统进行交互的以及操作系统如何加载和运行应用程序&&&&&
&&&3.在高级语言和机器语言的对比中,一对多的关系是什么意思?
&&&&&一条简单的高级语言指令会被扩展成多条机器语言指令。
&&&4.请解释下程序设计语言可移植性概念。
&&&&&一种语言的程序语言代码可以在多种计算机系统上编译运行,那么它就是可移植的。
&&&5.intel&80X86系列处理器的汇编语言与VAX或者motorala&68x00等系统的汇编是否相同?
&&&&&不相同,汇编语言和CPU指令集是密切关联的,每种CPU体系对应不同的汇编。
&&&6.举一个嵌入式系统应用的例子
&&&&&汽车的燃油控制和点火系统,空调系统,安全系统,飞行控制系统,手持计算机,调至解调器,打印机以及其他计算机外围智能设备。
&&&7.什么是设备驱动程序
&&&&&驱动程序是把操作系统的通用命令转换为对特殊硬件的具体细节操作的程序。
&&&8.在汇编语言和C++&语言中,那种语言对指针变量类型检查更为严格?
&&&&&&C++,汇编语言对指针不做任何限制。
&&&9.列举两种汇编语言比高级语言更适合编写的应用程序的例子
&&&&&嵌入式系统,硬件驱动。
&&&10.为什么在编写访问某特定品牌打印机的应用程序的时候,高级语言并不是理想工具?
&&&&&高级语言未必提供直接访问硬件的能力,即使提供了也经常要使用大量技巧维护,导致后期维护困难。
&&&11.为什么通常不是用汇编语言编写大型的应用程序?&
&&&&&&汇编语言只提供最小的结构支持,导致程序员必须人工组织大量代码,不同水平的程序员维护现存代码的难度极高。
&&&12.挑战:参考本章前面相应的例子,将c++表达式X=(Y*4)+3&换成汇编语言的形式。
&&&&&&&MOV&EAX,Y
&&&&&&&MOV&EBX,4
&&&&&&&IMUL&EBX
&&&&&&&ADD&EAX,3
&&&&&&&MOV&X&EAX
标 题:1.2 虚拟机的概念
作 者:ukyohy
时 间: &&&&&&有符号数:&最高有效位是符号位,0表示正数,1表示负数。&这个地方的文字描述和图相反。(怀疑图是错误的)
&&&&&&&&&&&&&??????
&&&&&&&&补码:&一般用补码表示法表示负整数。是否意味着有符号数只有负数才用补码??
&&&&&&&&&&&&&二进制的补码是所有负数取反最后加一。
&&&&&&&思考:补码的取反实际上时&进制数-1的结果-对应位数的结果。
&&&&&&&&&&&
&&&&&&&&&&&&&比如二进制1,取反得结果是&2-1-1&=&0
&&&&&&&&&&&&&十六进制&1,取反结果是16-1-1&=&E
&&&&&&&有符号数转换为10进制数:&&&&1.MSB为1,表示该数是负数,需要取反码,之后当成无符号数处理。
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&2.MSB为0,表示概述是正数,直接当无符号处理。
1.解释术语LSB
&&least&significant&bit:&最低有效位,一般指的是最右边的位数。
&&比如123456,其中6是最低有效位
2.解释术语MSB
&&&most&significant&bit:&最高有效位,一般指的是最左边的位数。
3.下列无符号二进制数对应的十进制数?
&&a&&=&248&&&&&&&&&&&&&&&&&&b&&=&202&&&&&&&&&&&&&c&
4.下列无符号二进制数对应的十进制?
&&a.&=&53&&&&&&&&&&&&&&&&&&&b.&=&150&&&&&&&&&&&&&c&&=&204
5&&下列二进制数的和是多少?
&&a.00010&&&=&&&&&&&&&&&&b.&+&000000(溢出?)&&&&&&&&&&&c&010(左移一位)
6.&下列二进制数的和是多少?
&&a.11011&=&&&&&&&&&&&&&&&b.110&&&&&&&&&&&&&&c&001
7&下列数据类型分别包含多少个字节?
&&1.字&&=2&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&2.&双字&=&4&&&&&&&&&&&&&&&&&&&&3.&4字&=&8
8.下列数据类型分别包含多少个数据位
&&字&&=&16&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&双字&&=&32&&&&&&&&&&&&&&&&&&&&&&&4字&=&64
9.为表示下列无符号数据,最少需要多少个二进制位
&&&65&=&7&&&&&&&&&&&&&&&&&&&&&256&=&9&&&&&&&&&&&&&&&&32768&=&16
10.为表示下列无符号数据,最少需要多少个二进制位
&&4095&&=&12&&&&&&&&&&&&&&&&&&&65534&=&16&&&&&&&&&&&&&&&&&&&2134657&=&22
11.2进制转换成16进制
&&&a&01&0111&&&=&CF57&&&&&&&&&&&&&&&&&&&&b.10&1101&&=&5CAD&&&&&&&&&&&&&&&&&&&&c.10&1011&=&93EB
12.2进制转成成16进制
&&&a.01&1010&&=&25DA&&&&&&&&&&&&&&&&&&&&&b.10&0011&=&CEA3&&&&&&&&&&&&&&&&&&&&&c.&01&1011&=&FED3
13.下列十六进制对应的二进制是什么
&&&a&E5B6AED7&&&=11&10&&&&&&&&&&&&&&&&&b&E697C7A1&=01&11&&&&&&&&&&&&
&&&&c&234B6D92=&00&01&
14.下列十六进制对应的二进制数是什么?
&&&&a&&&=&10&91&&&&&&&&&&&&&&&&&B.6ACDFA95&=&00&10&
&&&&C&F69BDC2A&&=&01&00&&
15&下列十六进整数对应的无符号十进制数是什么?
&&&&a.3A&&&=&58&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&b.1BF&=&447&&&&&&&&&&&&&&&&&&&&&&&&C&4096&=&16534
16&下列十六进制整数对应的无符号十进制数是什么?
&&&&a.62&&=&98&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&b.1C9&=&457&&&&&&&&&&&&&&&&&&&&&&&&&C&6A5B&=&27227
17.&下列有符号十进制整数对应的16位进制数是什么?
&&&&a&-26&&&=&&=&E6&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&b.&-452&&=&00&=&E3C
18.下列有符号十进制整数对应的16位进制数是什么?
&&&&A.-32&&&=&&=&E0&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&B.&-62&=&C2
19.下列16位十六进制数表示的是有符号数,请将其转换为十进制数
&&&&a.7CAB&=&31915&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&b.C123&=&-16076
20.下列16位十六进制数表示的是有符号数,请将其转换为十进制数&
&&&&a.7F9B&=&32667&&&&&&&&&&&&&&&&&&&&&&&&&&&&&b.8230&=&-32208
21.下列有符号二进制数对应的十进制数是什么?
&&&a.&=&-75&&&&&&&&&&b.&=&42&&&&&&&&&&&&&&&c&&=&-16
22.下列有符号二进制数对应的十进制数是什么?
&&&a&&=&-128&&&&&&&&&&&b.&=&-52&&&&&&&&&&&&&c.&=&-73
23.下列有符号十进制整数对应的8位二进制数(补码)是什么?
&&&a&-5&=&&&&&&&&&&&&&&&&&&&&&&&&&b&-36&=&&&&&&&&&&&&&&&&&&&&&&&c&-16&=&
24.下列有符号十进制整数对应的8位二进制数(补码)是什么?
&&&a&-72&=&&&&&&&&&&&&&&&&&&&&&&&&&b&-98&=&&&&&&&&&&&&&&&&&&&&&c&-26&=&
25&ASCII大写字母X的十六进制值和十进制值分别是什么?
&&&&hex:58
&&&&dec:88
26.ASCII大写字母M的十六进制值和十进制值分别是什么?
&&&&hex:4D&&&&dec:77
27.为什么要发明unicode?
&&&ASCII只用1个字节存储字符,由于各国语言不同,因此发明了用2个字节进行编码的unicode
28.挑战:用256位无符号整数能表示的最大值是多少?
&&&2的256次方-1
29.挑战:用256位有符号整数能表示的最大值是多少?
&&&2的255次方-1
标 题:1.4 布尔运算
作 者:ukyohy
时 间: 1.中央处理(CPU)除了包含寄存器之外还包含哪些其他基本部件?
&&CPU包含一个高频时钟,一个算术逻辑单元,一个控制单元,以及数量有限的寄存器
&&&时钟主要用于将CPU内部的操作和其他系统部件同步。(how?)
&&&控制单元(CU)协调执行机器指令时各个步骤的次序。
&&&算术逻辑单元(ALU)执行加法和减法之类的算术运算以及AND.OR.NOT之类的逻辑操作(没有乘除?)
&&&是否可以理解为CPU就是加减和NOT&AND&OR?&&
2.中央处理器使用哪三种总线同计算机的其他部分相连接?
&&&地址总线,控制总线,数据总线。
&&&数据总线:在CPU和内存之间传送指令和数据。输入输出设备的数据如何传送的??
&&&控制总线:使用二进制信号对连接到系统总线上的所有设备的动作进行同步。
&&&地址总线:当和内存进行数据交互的时候,地址总线保存指令和数据的地址。&&&
3.为什么访问存储器比访问寄存器要花费更多的机器周期?
&&存储器的速度比CPU慢的多,因此访问存储器,CPU需要等待一个或者几个时钟周期。
4.指令执行周期中的三个基本步骤是什么?
&&取指令,解码,以及执行。&&&
5.当使用内存操作数时,指令执行周期中海需要那两个额外的步骤?
&&取操作数,存储输出操作数
6.在指令执行周期的那个阶段中,程序计数器的值会增加?
&&控制单元取得指令,将其从存储器拷贝到CPU中并增加程序计数器的值。因此取指令的时候,PC的值将增加。
7.给出流水线执行的定义
&&PS:这个地方中译版有个地方翻译的不准确,按照原文,应该是386将一个指令执行***为6个阶段,486才引入流水线技术。
&&&&&intel的文档说386支持并行,486引入流水线,具体细节有待研究。&
&&通常情况下,一条指令的执行可以***成6步(386),CPU将一步一步的执行这些步骤,但是下一条指令并不需要等上一条6步全部执行完成后
&&再开始。可以当第一条指令的第一步执行完成后,在执行第一条指令第二步的时候,并发执行第二条指令的第一步。这就是流水线技术。
&&关于I386的6步,摘录如下:
&&&1.总线接口单元BIU,访问存储器并提供输入输出
&&&2.代码预取单元CPU(code&prefetch&unit):从BIU接收机器指令并将其插入到CPU内部的指令队列。
&&&3.指令解码单元:将队列中的指令进行解码,翻译成微代码
&&&4.执行单元:执行解码后的微代码
&&&5.分段部件:将逻辑地址转换成线性地址并进行保护检查。
&&&6.分页部件:将线性地址转换为物理地址,进行页保护检查并保留一个最近访问页的列表。
8.在5级非流水线处理器中,执行两条指令需要多少时钟周期?
&&对于K级的处理器,执行n条指令需要(n*k)个时钟周期。因此需要10个周期。
9.在5级单级流水线处理中,执行8条指令需要多少时钟周期?
&&对于单级流水线,k级处理器执行n条指令需要k+(n-1)=12&个周期
10.什么是超标量处理器?
&&两条以上的流水线,使得两条指令能够同时处于同一个执行阶段。
&&针对单流水线,如果某个阶段执行操作一个周期,那么将造成瓶颈。
&&针对某个K级处理器,如果某个阶段需要2个周期,那么执行N条指令需要&k+2n-1&个周期
&&如果将需要2个周期的地方扩充到2个流水线,u和v,那么直接导致&k+n出现。
&&PS:教材按照简化版本分析,貌似intel的处理多个阶段都可以并行处理。&
11.假设5级双流水线处理器中有一个阶段的执行周期需要两个时钟周期,执行10条指令需要多少时钟周期?
&&&k+n&=&5+10&=&15
12.当程序运行时,OS从磁盘的文件目录项中读取哪些信息?
&&&文件大小以及在磁盘驱动器上的物理位置。
13.程序装入内存后如何开始执行?
&&&程序装入内存后将程序的大小和位置等信息登记在一张表中。OS执行一条分支转移指令,使CPU在程序的第一条机器指令处开始执行。
14.试给出多任务的定义?
&&&操作系统能故同时运行多个任务。任务和进程并不等价。OS给每个人物分配一个时间片,轮流激活执行这些程序。
15.OS调度程序的功能是什么?
&&&任务切换??
16.当处理器从一个任务切换到另一个任务的时候,必须保存第一个任务的那些值?
&&&处理器中寄存器的内容,任务变量和程序计数器够构成。
标 题:2.2 IA-32处理器体系结构
作 者:ukyohy
时 间: 1.在保护模式下可寻址的内存范围是什么?
&&保护模式下32位地址总线,可寻址范围应该是0到FFFFFFFF
2.在实地址模式下可寻址的内存范围是什么?
&&实地址模式下20位地址总线,可寻址访问时0到FFFFF
3.在实地址模式下描述地址的两种方法是段-偏移量和什么?
&&20位线性地址?
&&段地址*10H+偏移量
&&CS&代码段
&&DS&数据段
&&SS&堆栈段
&&ES,FS,GS&可指向其他数据段??
4.在实地址模式下将下面的段-偏移量转换成线性地址:
5.在实地址模式下将下面的段-偏移量转成成线性地址:0CD1:02E0
6.在Microsoft汇编编译器使用的平坦内存模式下,使用多少个数据位存放指令或变量的地址?
7.在保护模式下,那个寄存器引用堆栈段的描述符?
8.在保护模式下,那张表包含指向程序使用的各种段的指针?
&&Global&descriptor&table&,Local&descriptor&table
9.在平坦分段模式下,那张表包含指向至少两个段的指针?
10.使用IA-32处理器分页特性的主要优点是什么?
&&同时运行的程序使用的内存总量大于实际内存&&
11.挑战:MS-DOS操作系统没有被设计为支持保护模式编程,你能想出一个与之有关的原因么?
&&&CPU不支持保护模式?内存比较昂贵?
12.挑战:在实地址模式下,解释说明两个段-偏移地址执向同一个线性地址的情况。
&&&&段地址*10h+偏移量&可以简化成X*10H+Y&,X,Y取不同的值得到的结构可能相同。
标 题:2.4 IA-32微机的构成
作 者:ukyohy
时 间: 1.在计算机操作系统的三种访问层次中,那个层次是最通用的和可移植性最好的?
&第一层,库函数
2.BIOS中已经存在和计算机硬件交互的代码了,为什么设备驱动程序还是必须的?
&BIOS没有包括所有的设备,如果出现无法识别的新设备就要用到驱动程序。
3.在显示字符串的例子中,在操作系统和视频控制芯片中还存在什么层次?
4.在那个层次上,汇编语言程序可以操作输入输出?
&&操作系统,BIOS,硬件
5.为什么游戏通常向声卡的硬件端口输出声音?
&&游戏要求的性能比较高,直接向硬件输出可以提高整体性能。
6.挑战:运行MS-WINDOWS的计算机BIOS会与运行LINUX的计算机使用的BIOS有所不同吗?
&&不会,一样的。
---------------------------------------华丽的分割线----------------------------------------------
终于结束前2章了,从第三章开始可以实际动手编程了,期待ing&
标 题:3.1 汇编语言基本要素
作 者:ukyohy
时 间: 代码如下:
TITLE&Add&and&subtract&&&&&{Addsub.asm)&;TITLE&是个伪指令,相当于注释
;&this&program&add&and&subtract&32bit&integer
INCLUDE&Irvine32.inc&&&&&&&&&&&&&&&&&&;INCLUDE&伪指令
.code&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&;.code&伪指令标示代码段的开始,所有的可执行语句都放在此
main&PROC&&&&&&&&&&&&&&&&&&&&&&&&&&&&&;&PROC&伪指令标示子程序的开始,子程序的名字是main
&&&&&mov&eax,10000h
&&&&&add&eax,40000h
&&&&&sub&eax,20000h
&&&&&call&DumpRegs
&&&&&exit&&&&&&&&&&&&&&&&&&&&&&&&&&&&&;退出程序,定义在irvine32.inc中,不属于MASM
main&ENDP&&&&&&&&&&&&&&&&&&&&&&&&&&&&&;ENDP伪指令标示子程序结束
END&main&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&;END伪指令表明该行是程序最后一行,编译器将忽略后面的内容,main&表示该程序的入口点
1.没有采用书本附带的MASM搭建环境。
2.采用网上最流行的MASM32,参考罗义斌的的介绍搭建环境:
&&Ultraedit&15.10&+&MASM32&V10&+&make32.bat(本书附带的,进行了适当修改)
3.关于本书带的几个库,进行了重新编译。
1.INCLUDE指令含义是什么?
&&将irvine32.inc&中的内容copy到程序中,类似于C中的含义
2..CODE伪指令的作用什么?
&&代码段的开始,所有可执行代码放在这里
3.以上程序,段的名字都有哪些?
4.如何显示寄存器内容的?
&&调用dumpregs&子程序
5.那条程序终止程序的执行?
6.那条伪指令开始一个过程?
7.那条伪指令结束一个过程?
8.END语句中的标识符的作用是什么?
&&程序的入口点,从这里开始执行
9.PROTO伪指令的作用是什么?
&&声明子程序的原型
------------------------华丽的分割线----------------------------------
终于第一次用汇编编译了第一个WIN32程序
标 题:3.3 编译链接和运行
作 者:ukyohy
时 间: &&1.内部数据定义
&&&&BYTE&&&&&&&&&&&&&&&&&8位无符号整数
&&&&SBYTE&&&&&&&&&&&&&&&&8位有符号整数
&&&&WORD&&&&&&&&&&&&&&&&&16位无符号&&(实地址模式近指针)
&&&&SWORD&&&&&&&&&&&&&&&&16位有符号
&&&&DWORD&&&&&&&&&&&&&&&&32位无符号(保护模式近指针)
&&&&SDWORD&&&&&&&&&&&&&&&32位有符号
&&&&FWORD&&&&&&&&&&&&&&&&48位整数
&&&&QWORD&&&&&&&&&&&&&&&&64位整数
&&&&TBYTE&&&&&&&&&&&&&&&&80位整数
&&&&REAL4&&&&&&&&&&&&&&&&32位IEEE短实数
&&&&REAL8&&&&&&&&&&&&&&&&64位IEEE长实数
&&&&REAL10&&&&&&&&&&&&&&&80位IEEE扩展精度实数
&&2.数据定义语句
&&&[名称]&数据定义伪指令&初始值[,初始值]&...
&&&数据定义语句至少要有一个初始值或者“?”&符号。
&&&3.定义BYTE和SBYTE数据
&&&value1&BYTE&'A'
&&&value2&BYTE&0
&&&value3&BYTE&255
&&&value4&SBYTE&-128
&&&value5&SBYTE&+127
&&&value6&BYTE&?&&;未初始化
&&DB伪指令:
&&&val1&DB&255
&&&val2&DB&-128&
&&&无法区分有符号数据和无符号数据
&&多个初始值:&&list&BYTE&10,20,30,40
&&并非所有的数据定义都需要标号:&&&
&&&&&&&&&&&&&&&&list&BYTE&10,20
&&&&&&&&&&&&&&&&&&&&&BYTE&30,40
&&&&&&&&&&&&&&&&&&&&&
&&&可以同时使用不同进制的数字
&&&list1&BYTE&10,32,41h,b
&&&list2&BYTE&0AH,20h,'A',22h
&&&4.定义字符串&
&&&&&greeting1&BYTE&&Good&afternoon&,0&;&空字符结尾的字符串
&&&&&greeting&BYTE&&Welcome&to&the&encryption&demo&program&
&&&&&&&&&&&&&&BYTE&&created&by&KIP&,0dh,0ah
&&&&&&&&&&&&&&BYTE&&&if&you&wish&,0
&&&&&&以上是连续字符串,中间夹杂回车换行。
&&&&&行延续符:&&&&&&greeting&\
&&&&&&&&&&&&&&&&&&&&&BYTE&&welcome&to&the&encry&
&&&&&DUP&操作符:
&&&&&&&&&&&&&BYTE&20&DUP(0)&&&&&&&&&;20个0
&&&&&&&&&&&&&&&BTTE&20&DUP(?)&&&&&&&&&&;20&字节,未初始化
&&&&&&&&&&&&&&&BYTE&4&&DUP(&STACK&)&&&&;4&个STACK
&&&&5.定义WORD,SWORD
&&&&&&word&word&65525
&&&&&&&word2&sword&-32768
&&&&&&&word3&word&?
&&&&&&&DW&指令:
&&&&&&&val1&DW&65525&&&;无符号&
&&&&&&&val2&DW&-32768&&;有符号
&&&&&&&字数组:
&&&&&&&&mylist&word&1,2,3,4&&;&每个2字节
&&&&&&&&array&word&5&dup(?)
&&&&&&5.DWORD&&SDWORD
&&&&&&&val1&dword&&&h
&&&&&&&val2&sdword&&-
&&&&&&&val3&dword&&&20&dup&(?)
&&&&&&&DD伪指令
&&&&&&&VAL1&DD&
&&&&&&&mylist&DWORD&1,2,,3&&每个4字节
&&&&&&&quad1&qword&1111h
&&&&&&&quad1&dq&&1111h
&&&&&7.TBYTE&
&&&&&&&val1&TBYTE&111111h&;&80&bit
&&&&&&&val1&dt&&&&1111111&&&&&&&&&&;&80&bit
&&&&&8&定义实数
&&&&&&&rval1&&REAL4&&-2.1&&&&&&&&&&&;单精度,有效位数&6,范围&1.18E-38&---------3.40E+38&
&&&&&&&rval2&&REAL8&&3.2E-260&&&&&&&;双精度,&有效位数15,范围2.23E-308----------1.79E+308
&&&&&&&rval3&&REAL10&4.6E+4096&&&&&&;扩展精度,有效位数19,范围3.37E-4932&-------1.18E+4932
&&&&&&老版本用DD,DQ,DT定义实数
&&&&&9.小尾顺序
&&&&&&最低有效字节存储在地址值最小的地址单元。
&&&&&&H,在内存中的实际存储时.
&&&&&10.带变量的程序
&&&&&&&&TITLE&Add&and&subtract&&&&&{Addsub.asm)&;TITLE&是个伪指令,相当于注释
&&&&&;&this&program&add&and&subtract&32bit&integer
&&&&&&&&INCLUDE&Irvine32.inc&&&&&&&&&&&&&&&&&&;INCLUDE&伪指令
&&&&&.data
&&&&&&&&val1&dword&10000h
&&&&&&&&val2&dword&40000h
&&&&&&&&val3&dword&20000h
&&&&&&&&finalval&dword&?
&&&&&&&&.code&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&;.code&伪指令标示代码段的开始,所有的可执行语句都放在此
&&&&&main&PROC&&&&&&&&&&&&&&&&&&&&&&&&&&&&&;&PROC&伪指令标示子程序的开始,子程序的名main
&&&&&&&&&&&mov&eax,val1
&&&&&&&&&&&add&eax,val2
&&&&&&&&&&&sub&eax,val3
&&&&&&&&&&&mov&finalval,eax
&&&&&&&&&&&call&DumpRegs
&&&&&&&&&&&exit&&&&&&&&&&&&&&&&&&&&&&&&&&&&&;退出程序,定义在irvine32.inc中,不属于MASM
&&&&&&&main&ENDP&&&&&&&&&&&&&&&&&&&&&&&&&&;ENDP伪指令标示子程序结束
&&&&END&main&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&;END伪指令表明该行是程序最后一行,编译器将忽略后面的内容,main&表示该程序的入口点
&&&&&11.未初始化数据的声明
&&&&&&.data?&伪指令可用于声明未初始化的数据。
&&&&&&&可以缩小包含大块未初始化数据程序的尺寸。
&&&&&&&.data?
&&&&&&&&var1&dword&500&dup(?)
&&&&&&&.data
&&&&&&&&var1&dword&500&dup(?)
&&&&&&&&下面生成的程序会比上面大的多。
&&&&&&&&&.code
&&&&&&&&&.data
&&&&&&&&&.code&&
&&&&&&&&&可以回来使用。
1.为一个16位有符号数创建未初始化的数据声明
&&&var1&sword&?
&&&&var1&dw&?
2.为一个8位无符号整数创建未初始化的数据声明
&&&var1&byte&?
3.为一个8位有符号整数创建未初始化的数据声明
&&&var1&sbyte&?&&&
4.为一个64位整数创建未初始化的数据声明
&&&var1&qword&?
5.那种数据类型可以存放32位有符号整数?
&&&var1&sdword&?
6.声明一个32位有符号整数变量,并用最小的十进制负整数初始化
&&&var1&sdword&-1
7.声明一个名为wArrary的16位无符号整数变量,并带3个初始值
&&&wArrary&word&1h,2,3
8.声明一个包含你最喜欢的颜色名称的字符串变量,并以空字符结尾。
&&var1&byte&&yello&,0
9.声明一个名为dArry数组,包含50个未初始化的无符号双字整数。
&&&dArry&dword&50&DUP(?)
10.声明一个包含500个单词&&TEST&&的字符串变量
&&&string&byte&500&dup(&TEST&)
11.声明一个名为bArray包含20个无符号字符的数组,将全部字节初始化为0
&&&bArray&byte&20&dup(0)
12&说明下列双字节变量在内存中的字节存储顺序(从低到高)
&&&vall&DWORD&h
&&&&&21&&43&65&87&,&每个占有4个字节,总共16字节。&
标 题:3.5 符号常量
作 者:ukyohy
时 间: DOS下编程,现在基本用不到。需要的时候再看,暂时跳过。
标 题:3.8 编程练习
作 者:ukyohy
时 间: &2.操作数类型
&&立即操作数,寄存器操作数,内存操作数
&&&r8&&&8位通用寄存器
&&&r16&&16位通用寄存器
&&&r32&&32位通用寄存器
&&®&&寄存器
&&&sreg&&16位段寄存器
&&&imm&&&8,16,32位立即数
&&&r/m8&&8位寄存器/内存&操作数
&&&mem&&&8,16,32&内存操作数
&3.直接内存操作数
&&&mov&eax,val1&&&&&&
&&&mov&eax,[val1]&&;不常用
&4&MOV&指令
&&&1.操作数尺寸必须一致
&&&2.不能同时为内存操作数
&&&3.目的操作数不能使CS,EIP,IP
&&&4.立即数不能直接送到段寄存器
&&&&mov®,reg
&&&&mov&mem,reg
&&&&mov®,mem
&&&&mov&mem,imm
&&&&mov®,imm
&&&&内存数据的移动,要通过寄存器转移,不能直接mov&两个内存操作数。
5.整数的零/符号扩展
&&&当将16位数据送入EAX的时候,虽然MOV&指令必须要用&AX作为操作数,但是要考虑AX高16位旧数据的问题。
&&&&.data&
&&&&&var1&WORD&1
&&&&&.CODE
&&&&&&mov&eax,0&&&;&因此最好在之前将eax&清零
&&&&&&mov&ax,var
&&&&&&但是针对赋值,不能直接清0,要用FFFFFFFFH填充。
&&&&&&movzx&0&扩展指令
&&&&&&movzx&r32,r/m16
&&&&&&movzx&r32,r/m8
&&&&&&movzx&r16,r/m8
&&&&&&因为是用0扩展最高有效位,所以只能用于无符号数
&&&&&&movsx&&符号位扩展
&&&&&&&movsx&r32,r/m16&
&&&&&&&movsx&r32,r/m8
&&&&&&&movsx&r16,r/m8
&6.LAHF,SAHF
&&&LOAD&STATUS&FLAGS&INTO&AH
&&&STORE&AH&INTO&EFLAGS
&&&AH&----&EFLAG&低字节
&&&数据交换指令&&
&&&XCHG®,REG
&&&XCHG®,MEM
&&&XCHG&MEM,REG
8.直接偏移操作数
&&&&&变量偏移地址&+&常数
&&&&&array&BYTE&10H,20H,30H,40H
&&&&&MOV&AL,[array&+&1]&;&al=&20h
&&&&&MOV&AL,array&+&1&;&&两条语句等价
&&&&&MASM并不对数组的下标进行检查,所以程序员要保证数组下标不越界。
&&&&字和双字节数组:
&&&&&arrayW&WORD&100h,200h,300h
&&&&&mov&AX,[array&+&2]&;偏移量按照字节计算,所以双字就要+4
&&&&例子程序:
&&TITLE&Move&data&test&&&&&{Move.asm)&;TITLE&是个伪指令,相当于注释
;&Description:&all&the&command&in&sec.&4.1
;&Author:ukyohy
;&Create&Date:
;&Version:1.0
;&Data:&&&&&&&&&&&&&&&&&Modify&by:
include&Irvine32.inc
&&val1&word&1000h
&&val2&word&2000h
&&arrayB&BYTE&10h,20h,30h,40h
&&arrayW&word&100h,200h,300h
&&arrayD&DWORD&1h&&&
.code&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&;.code&伪指令标示代码段的开始,所有的可执行语句都放在此
main&PROC&&&&&&&&&&&&&&&&&&&&&&&&&&&&&;&PROC&伪指令标示子程序的开始,子程序的名字是main
&&&;movezx
&&&mov&bx,0A69Bh&&&&&&&&;ebx=&7FFDA69Bh
&&&movzx&eax,bx&&&&&&&&&;eax=&0000A69Bh
&&&movzx&edx,bl&&&&&&&&&;edx=&0000009Bh
&&&movzx&cx,bl&&&&&&&&&&;ecx&=&0012009Bh
&&&mov&bx,0A69Bh&&&&;ebx&=&7FFDA69Bh
&&&movsx&eax,bx&&&&&;eax&=&FFFFA69Bh
&&&movsx&edx,bl&&&&&;edx&=&FFFFFF9Bh
&&&movsx&cx,bl&&&&&&;ECX&=&0012FF9Bh
&&&;memory&to&memory&xchange
&&&mov&ax,val1&&&&&&;EAX&=&FFFF1000h
&&&xchg&ax,val2&&&&&;eax&=&FFFF2000H
&&&mov&val1,ax&&&&&&;val1&=&2000H&
&&&;direct&offset&addressing&(byte&array)
&&&mov&al,arrayB&&&&;EAX&=&FFFF2010H
&&&mov&al,[arrayB+1]&;EAX&=&FFFF2020H
&&&mov&al,arrayB+2;&&;EAX&=&FFFF2030H
&&&;direct&offset&addressing&(word&array)
&&&mov&ax,arrayW&&;EAX&=&FFFF0100
&&&mov&ax,[arrayW+2]&;EAX&=&FFFF0200
&&&;direct&offset&addressing&(doubleword&array)
&&&mov&eax,arrayD&;&eax=h
&&&mov&eax,[arrayD+4]&;eax&=&h&&&
main&ENDP&&&&&&&&&&&&&&&&&&&&&&&&&&&&&;ENDP伪指令标示子程序结束
END&main&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&;END伪指令表明该行是程序最后一行,编译器将忽略后面的内容,main&表示该程序的入口点
--------------------------------------------------------------------------------
1.三种基本的操作数类型都有哪些?
&&理解操作数,寄存器操作数,内存操作数
2.mov指令的目的操作数不能使段寄存器?
3.mov指令的第二个操作数是目的操作数?
&&no,是源操作数
4.EIP寄存器不能作为mov指令的目的操作数?
5.在intel使用操作数表示法中,r/m32表示什么?
&&32位内存或者寄存器操作数
6.在intel使用的操作数表示法中,imm16表示什么?
&&16位立即操作数
以下习题使用下面的变量定义
&&&&&&.data
&&&&&&&var1&SBYTE&-4,-2,3,1
&&&&&&&var2&WORD&h,h
&&&&&&&var3&SWORD&&-16,-42
&&&&&&&var4&DWORD&1,2,3,4,5
7.对于下面的每条语句,指明其是否有效
&&a.mov&ax,var1&&&&&&&&;no,大小不同&
&&b.mov&ax,var2&&&&&&&&;ok
&&c.mov&ax,var3&&&&&&&&;ok
&&d.mov&var2,var3&&&&&&;no,不能同时为内存操作数
&&e.movzx&ax,var2&&&&&&;no,源操作数不能和目的操作数长度相同
&&f.movzx&var2,al&&&&&&;no,目的操作数只能是寄存器
&&g.mov&ds,ax&&&&&&&&&&;ok
&&h.mov&ds,1000h&&&&&&&;no,不能将立即数赋值到段寄存器
8.下列每条指令按顺序执行后,目的操作数的16进制值是什么?
&&mov&al,var1&;
&&mov&ah,var1+3
&&ah&=&01H
9.下列每条指令按顺序执行后,目的操作数的值是什么?
&&mov&ax,var2
&&ax&=&1000h
&&mov&ax,var2+4
&&ax&=&3000h
&&mov&ax,var3
&&ax&=&fff0h&;这里要注意,双字节
&&mov&ax,var3-2
&&ax&=&4000h
10.下列每条指令按顺序执行后,目的操作数的值是什么?
&&mov&edx,var4
&&movzx&edx,var2
&&mov&edx,var4+4
&&movsx&edx,var1&&;OD无法反汇编出来。。。。
&&edx&=&fffffffch
标 题:4.2 加法和减法
作 者:ukyohy
时 间:

参考资料

 

随机推荐