内容发布更新时间 : 2024/12/24 10:20:26星期一 下面是文章的全部内容请认真阅读。
左边第~操作数默认为相对于SS段偏移的存储器操作数
右边第一操作数采用段超越,指定为相对于DS段偏移的存储器操作数 13、写出判断AL为正为负的程序段(请至少用三种方法)。
答:方法一:CMP AL,80H ;而后用JAE代表负数转移,JB代表正数转移
方法二:CMP AL,00H ;而后用JGE代表正数转移,JL代表负数转移
方法三:TEST AL,80H ;而后用JNZ代表负数转移,JZ代表正数转移
方法四:OR AL,AL ;而后用JNS代表负数转移,JS代表正数转移
方法五:AND AL,AL ;而后用JNS代表负数转移,JS代表正数转移
方法六:SUB AL,00H ;而后用JGE代表正数转移,JL代表负数转移
方法七:TEST AL,80H :而后用JNS代表正数转移,JS代表负数转移
14、思考题:试比较以下几条指令的功能。 答:MOV BX,SI ;将SI的值送给BX
MOV BX,[SI] ;将SI的值作为偏移地址找到对应的内存单元中的值送给BX
MOV BX,OFFSET[SI] ;将Sl的值作为偏移地址找到对应内存单元的偏移地址送给BX,即SI的值送给BX
LEA BX,[SI] ;将Sl的值作为偏移地址找到对应内存单元的偏移地址送给BX, 即Sl的值送给BX
LDS BX,[SI] ;将Sl值作为偏移地址找到对应内存单元中的第一个字值送给BX, 第二个字值送DS
LES BX,[SI] :将SI值作为偏移地址找到对应内存单元中的第一个字值送给BX, 第二个字值送ES
15、设B、D为字节变量,A、C为字变量,且A除B可能会溢出,试编写无符号数或有符号数A/B商送C,余数送D。 答:可能会溢出则要考虑扩展数据表示能力。
;无符号数除法 . ;有符号数除法 MOV AL,B MOV AL,B XOR AH,AH CBW
MOV BX,AX MOV BX,AX MOV AX,A MOV AX,A
XOR DX,DX ;无符号扩展 CWD ;有符号扩展 DIV BX IDIV BX MOV C,AX MOV C,AX MOV D,DL MOV D,DL
16、编写程序段实现DX、AX中32位二进制数*l0 (设不溢出)。 答:;X*10=X*8+X*2,用移位指令实现
SHL AX,1
RCL DX,1 :DX,AX=(DX,AX)*2 MOV BX,DX
MOV BP,AX ;BX,BP转存2倍值 SHL AX,l
RCL DX,l ;再乘2 SHL AX,l
RCL DX,1 :再乘2 ADD AX,BP
ADC DX,BX ;8倍+2倍=10倍 17、请编写程序段实现如图3.33所示功能。
MOV SI,BX LDS BX,[SI] 18、设已有定义 STR DB “Sdfikjwsmfw893040pYUIUKLHGUkjdshf8” N EQU $ - STR1
试编写实现在STR中查找是否存在非‘A’的功能程序段。即表示STR串中大部分是‘A’,若其中存在不是‘A’的字符则查找成功,若STR全部为‘A’则不成功。
19、程序理解执行。
(1) MOV AH,一l ;AH=FFH MOV AL,180 ;AL=B4H MOV BL,15 ;BL=0FH
IDⅣ BL ;AX/BL即:-76/15,商-5,余数-l 程序段执行后,AX=0FFFBH。
说明:关键是要知道谁除以谁,特别注意是有符号除还是无符号除。 (2) MOV AL,0CH ;AL=0CH
OR AL,AL ;AL=0CH,CF=0 SBB AL,0F0H ;AL=lCH
NEG AL ;AL=E4H,CF=1 ADC AL,0D4H ;AL=B9H
TEST AL,35H ;AL=B9H,CF=0 程序段执行后,CF= 0 ,AL=B9H。
说明:第(1)、(2)小题只要理解每条指令功能及对标志位的影响,逐步进行即可完成。
(3) MOV AL,08H
MOV AH,一l ;AX=FF08H MOV BX,0F8H ;BX=00F8H CMP AX,BX
程序段执行后SF⊕OF=1 ,CF= 0 。
(4) MOV AX,?中? ;AX的二进制高位为1,即落在负数范围 MOV BX,?AB? ;BX的二进制高位为0,即落在正数范围 CMP AX,BX
程序段执行后SF⊕OF=1 ,CF= 0 。
说明:第(3)(4)小题实质是考查有符号数和无符号数大小的比较。 (5) MOV AX,?58? ;AX=3538H AND AX,0F0FH ;AX=0508H
AAD ;AX=58=003AH 程序段执行后AX= 003A H,即58。
程序段的功能是:将两位非压缩BCD码转化为其对应的十六进制数。 说明:可用AAD指令实现将十位和个位数值拼装还原为0~99的十六进制数。反之将0~99的数值分离成十位和个位可用AAM指令实现,教材《汇编语言、微机原理及接口技术(第2版)》例5.10和例5.13中均有应用。 20、程序语句填空。
(1)下列是完成1~20之间的奇数累加和存于AL中的程序段: XOR AL,AL
MOV CX,10 ;循环次数 MOV BL,1 AGAIN:ADD AL.BL
ADD BL,2 ;步长,参数改变 LOOP AGAIN
(2)下列是在串长为N的串STR中查找是否有?M?字符的程序段: MOV DI,SEG STR MOV ES,DI LEA Dl,STR CLD
MOV CX,N MOV AL,7M7
REPNE SCASB ;串查找核心指令 JZ FOUND ;转到找到分支
(3) 下列是完成1位十六进制数X显示的程序段: MOV DL,X AND DL,0FH
ADD DL,30H ;或OR DL,30H CMP AL,?9? JBE NEXT ADD DL,7 NEXT:MOV AH,02H INT 21H
(4) 将DH中的二进制数看成压缩BCD码并送出显示的程序段如下: MOV DL,DH
MOV CL,4 ;获取十位 SHR DL,CL ADD DL,30H
MOV AH,2 ;2号功能调用显示十位 INT 21H
MOV DL,DH
AND DL,0FH ;获取个位 OR DL,30H INT 21H 21、图略
22、假定AX和BX中的内容为带符号数,CX和DX的内容为无符号数,请用比较指令和转移指令实现以下条件转移:
(1)若DX的内容超过CX的内容,则转到Ll。 答:CMP DX,CX JA Ll
(2)若BX的内容大于AX的内容,则转到L2。 答:CMP BX,AX JG L2
(3)若DX的内容未超过CX的内容,则转到L3。 答:CMP DX,CX JNA L3
(4)判断BX与AX相比较是否产生溢出,若溢出则转到L4。 答:CMP BX,AX JO L4
(5)若BX的内容小于等于AX的内容,则转到L5。 答:CMP BX,AX JLE L5
(6)若DX的内容小于等于CX的内容,则转到L6。 答:CMP DX,CX JBE L6
23、假设BX=0A69H,VALUE变量中存放的内容为1927H,写出下列各条指令执行后的BX的寄存器中和CF、ZF、SF与OF的值:
(1) XOR BX,VALUE (2) AND BX,VALUE (3) OR BX,VALUE (4) SUB BX,VALUE (5) CMP BX,VALUE (6) TEST BX,VALUE
答: BX CF ZF SF OF (1) 134EH 0 0 0 0 (2) 0821H 0 0 0 0 (3) 186FH 0 0 0 0 (4) Fl42H 1 0 1 0 (5) 0A69H 1 0 1 0 (6) 0A69H 0 0 0 0