┇
上述程序段运行后,从B单元开始依次存放的数据是多少?
FC FE FF F8H=1111 1000
右移一位变为 1111 1100 = FC 再右移一位变为 1111 1110 = FE 再右移一位变为 1111 1111 = FF
调试结果:
2、分析下面程序段的功能
……
DATA SEGMENT
S9 DB 0,1,2,3,4,5,6,7,8,9 DATA ENDS ┇
LEA SI,S9 LEA DI,S9+1 MOV CX,5 LOP:
MOV AL,[SI] XCHG AL,[DI] MOV [SI],AL ADD SI,2 ADD DI,2 LOOP LOP ……
上述程序段运行后,S9开始的10个字节存储单元内容是什么? 01 00 03 02 05 04 07 06 09 08
3、已知BUF开始的数据区中存放有10个大、小写字母,分析下面程序段完成的功能是什么? …… MOV CX,10
LEA BX,BUF K2:MOV AL,[BX] CMP AL,?Z? JBE K1
SUB AL,20H (20H=32,大小写字母相差32) MOV [BX],AL K1:INC BX LOOP K2 ……
实现功能:把小写字母变为大写字母 4. 分析下面程序段完成的功能是什么?
…… ;(DX:AX)联合存放了一个32位数据
MOV CL, 4
SHL DX, CL DL=****0000 MOV BL, AH
SHL AX, CL AL=****0000
SHR BL, CL BL即AH的内容,AH=0000****,四个星号为原来AX的高四位 OR DL, BL
……
功能:把ax的高四位写入到 dx 的低四位
5、分析下面程序段完成的功能是什么?
……
MOV CX,10
LOP1:MOV AH,1 INT 21H
PUSH AX LOOP LOP1
MOV CX,10 LOP2:
POP DX
MOV AH,2 INT 21H
LOOP LOP2
……
功能:把输入的字符逆向输出
6、以下是二进制数(bx)到十六进制数转换并显示程序的源文件BINIHEX.ASM,阅读并完成该程序。
……
START : MOV CH, 4 bx为16位,bx要循环4次,用ch来计次数 ROTATE: mov cl,4 ROL BX, CL
MOV AL, BL bx循环左移后,原来的高四位变为低四位,把bl 的
值送给al, 以免后面的操作影响bx 的值
And al, 0fh 与0fh 相与,只保留低四位 ADD AL, 30H 转换为 ASII 码
CMP AL, 3AH ASII码大于 3Ah 则al 的值大于 9,若小于3Ah,
直接输出
JL PRINTIT
Add al,07h ASII码大于3Ah , A的ASII码为41h, 所以要加上7,
可以输出相应的ABCD....
PRINTIT : MOV DL, AL
Mov ah, 02h INT 21H
Dec ch
JNZ ROTATE ch为零时跳出循环
MOV AH, 4CH INT 21H ……
7、以下是子程序BCDIASC,请阅读程序并完成填空。
;功能:将十进制的两位数的BCD码转换为ASCII码并在屏幕中间显示. ;参数:(AL)= 十进制的两位数的BCD码,无出口参数 BCDIASC : MOV AH, AL
MOV CL, 4 shr ah, cl ;将AH的高4位移至低4位
And al, 0fh ;保留AL的低4位
ADD AH, 30H ;转变为ASCII码 Add al, 30h MOV BX,0B800H Mov es , bx
MOV BYTE PTR ES:[160*12+40*2] ,AH ;显示十位数
MOV BYTE PTR ES:[160*12+40*2+2] ,AL ;显示个位数
ret ;子程序结束,返回主程序
8. 下面程序通过子程序调用,将数据段中字数组ARRAY的COUNT个元素求和,并将结果送SUM单元(COUNT、SUM都是字单元),分析这段程序后补充完整程序中的空格部分。
……
MOV BX, OFFSET SUM PUSH BX
MOV BX, OFFSET ARRAY PUSH BX
MOV BX, OFFSET COUNT PUSH BX
CALL SUMPRO ;调用子程序计算 …….
SUMPRO PROC NEAR
PUSH AX
PUSH CX PUSH SI PUSH DI PUSH BP MOV BP, SP
MOV SI, [BP+ 14 ] MOV DI, [BP+ 12 ] MOV CX, [DI]
MOV DI, [BP+ 16 ] 这题不懂的话,可以找师兄我。 XOR AX, AX NEXT : ADD AX, [SI] ADD SI, 2
LOOP NEXT MOV [ DI ], AX POP BP POP DI POP SI POP CX POP AX RET SUMPRO ENDP ……
请画出用堆栈传送参数地址时,堆栈最满时的状态。
五、编程题
1、从BUF1单元开始存放有10个字节的字符串,使用串传送指令编写指令序列将BUF1
中的数据复制到BUF2开始的10个字节单元。
lea si,BUF1 ;si的段地址为ds lea di,BUF2 ;di的段地址为es mov cx,10 cld