八、填空题。
1.假设(SS)=3000H,(SP)=1008H;如果在堆栈中存入3个数据,则栈顶的物理地址为_31002_H; 如果又从堆栈中取出5个数据, 则栈顶的物理地址为_3100C_H;再从堆栈中取出4个数据,则栈顶的物理地址为_31014_H;如果又在堆栈中存入6个数据,则栈顶的物理地址为_31008_H。
2.字符“0” 加5后的字符是_“5”_;字符“a” 减20H后的字符是_“A”_。
答案:第1空:"5",第2空:"A" 。
做法:1,出入栈每个数据以字(2bytes)为单位,入栈向低地址伸展,即入栈sp-n*2,出栈为sp+n*2,物理地址SS*10H+SP
2,常识小写字母ASCII码值比大写字母大20H,数字的ASCII码值低四位为数字,高四位相同
九、根据下列各题的要求,编制程序。
1.用移位、传送和加法指令完成(AH)*9的计算。(设积不会溢出)
小学算法:a*9=a*8+a:移位可实现2,4,8倍或1/2,1/4,1/8
mov al,ah-->mov cl,4 -->shl ah,cl--->add ah,al
2.设I、J、K为无(有)符号字节(字)变量,将J、K中大(小)的存入I中。
mov ax,J-->mov bx,K-->cmp ax,bx
ja axGreater 无符号数比较,ax大直跳
mov ax,bx 否则,将较大的bx移入ax,保证ax始终最大
axGreater:
mov I,ax
>>>>>>>>>
mov ax,J-->mov bx,K-->cmp ax,bx
jl axLower 有符号数比较,ax小直跳
mov ax,bx 否则,将较小的bx移入ax,保证ax始终最小
axLower:
mov I,ax
3.设X、Y、Z均为有符号的字变量,计算(678+X*9)/234, 并将商存入Y中、余数存入Z中。
mov ax,X-->mov bx,9-->mul bx-->add ax,678-->adc dx,0-->mov bx,234-->div bx
mov Y,ax-->mov Z,dx
5.数据段D中有 M DB ‘HOW DO YOU DO?’,0DH,0AH,‘$’ ,显示此字符串。
mov dx,offset M
mov ah,9
int 21h
6.将键盘输入的大(小)写字母用小(大)写字母显示出来,若输入的不是大(小)写字母,则返回。
不带回显键盘输入功能号-->ah
main proc
start:
int 21h
cmp al,41h
jb exit ;z
cmp al,5Ah
jna uppercase
cmp al,61h
jnb lowercase
exit:
ret
uppercase:
add al,20h
jmp showch
lowercase:
sub al,20h
showch:
mov dl,al
ret
main endp
end start
8.将DL中的低四位二进制数以十六进制数形式显示出来。
mov cl,4-->shl dl,cl-->shr dl,cl
cmp dl,10h
jnb decimalnum
sub dl,10h
add dl,'A'
jmp showit
decimalnum:
add dl,30h
showit:
显示字符功能号-->ah
int 21h
B.测试8EH中0的位数。
mov al,8Eh
mov cx,8
xor bl,bl
bittest:
shl al,1
jc continue
inc bl
continue:
loop bittest
0的位数在bl中
C.测试8EH中1的位数。
mov al,8Eh
mov cx,8
xor bl,bl
bittest:
shl al,1
jnc continue
inc bl
continue:
loop bittest
1的位数在bl中
D.计算305*3,程序段执行后,DX=________ ,AX=________ 。
305>256,在ax中,mul后为dx:ax,明显不超过ax表示范围,即dx=0,ax=915
E.计算41*3,程序段执行后,AX=_123D_ 。
F.计算0F2/3,程序段执行后,AX=________ 。
ax=f2,bl=3,mul bl==>al=商,ah=余
需分有符号数与无符号数除法分析
G.计算62/3,程序段执行后,AH=________ ,AL=________ 。
同上
H.统计正(负/奇/偶)数的个数。
n位Reg或Men表示个数为:
正:有符号--》2^(n-1)-1;无符号2^n
负: 2^(n-1)
奇数、偶数:2^(n-1)