题目来源:http://tieba.baidu.com/p/5982697172
;+----------------------------
4.下列程序段执行后实现什么功能?
mov bx,2050h ;取数组首地址
mov cl,10 ;循环10次
next:
mov al,[bx] ;从数组中取一个元素的值进al
xor al,0ffh ;al取补码
inc al ;再加1,(到此完成正变负,负变正)
and al,al ;最高位为1吗?(现在是负数吗)
jns down ;现在不是负数(那就是正数)就跳转
xor al,0ffh ;/否则再恢复原数仍放在al中
inc al ;\
down:
mov [bx],al ;用al的值回写数组元素()
inc bx ;数组元素地址加1
dec cl ;循环次数减1
jnz next ;CL<>0就跳转。
hlt
;结论:本段程序实现的功能是,在地址2050开始处有一10个元素
; 的字节数组,各元素为带符号数,编程完成将数组中为负
; 数的元素转换为正数元素。(或者表述为转换为绝对值..)
;+----------------------------
2.下列程序段执行后实现什么功能?
mov si,2500h;取首地址进si
mov cx,8 ;循环变量赋初值8
xor ax,ax ;ax清0
mov ax,[si] ;从数组中取一数进al
inc si ;调整si
inc si ;si再加1
dec cx ;循环次数减1
next: ;循环开始
add ax,[si] ;ax加下一个数组元素
add si,2 ;调整数组元素的地址
loop next ;(cx)=(cx)-1 ,如果(cx)<>0,则继续循环
;很明显,循环的功能是累加数组元素
;累加的结果保留在ax中
mov [2000h],ax;将累加结果写入首地址为2000h的字单元。
hlt
;结论,本段程序的功能是实现数组各元素求和,累加结果记入
; [2000h]字单元
;+----------------------------
下列程序段执行后,问:程序实现什么功能?
mov sp,2000h ;栈指针赋值
mov ax,[3000h] ;(ax) = x,假设x就是[3000h]
mov bx,08h ;(bx)=8
push bx ;/通过栈操作实现
pop dx ;|(si)=(dx)=(bx)=8
push dx ;|
pop si ;\
add ax,bx ;(ax)=(ax)+(bx)=x+8
mov cl,2 ;设置移位数
sal ax,cl ;/(ax)=4*(ax)=4(x+8)
sal si,1 ;\(si)=2*(si)=2*8=16
add ax,dx ;(ax)=(ax)+(dx)=4(x+8)+8
add ax,si ;(ax)=(ax)+(si)=4(x+8)+8+16
mov [4000h],ax ;记入存储器
hlt
结论:程序实现 y = 4(x+8)+8+16 = 4x+32+24 = 4x+56
; 注:机器数左移一位相当于机器数扩大了一倍...,当然不能出现
; 溢出问题
;+----------------------------
;下列程序段执行后问:程序执行完后,堆栈中压入了几个数?
;按压入次序写出这些数据,该程序的功能。
MB1 DB 255 ;
...
mov al,MB1 ;(al)=[MB1]
xor ah,ah ;ah清0
inc ax ;(ax)=(ax)+1=255+1=256
mov dx,10 ;设置除数为10
RL1:
div dl ;ax/dl 商在al中,余数在ah中
mov bl,ah ;/
mov bh,0 ;|ah借道bx,将余数压栈
push bx ;\
xor ah,ah ;ah清0,为进入下一循环作好准备
cmp al,0 ;商为0吗?
jnz rl1 ;不为0就再循环一次
hlt ;
结论: 本程序实现将机器数255+1转换为十进制未压缩的BCD数,
程序执行完后,堆栈中压入了3个数,压栈的顺序的6,5,2
;+-----------------------------
最后一题无聊,略。
;+----------------------------
4.下列程序段执行后实现什么功能?
mov bx,2050h ;取数组首地址
mov cl,10 ;循环10次
next:
mov al,[bx] ;从数组中取一个元素的值进al
xor al,0ffh ;al取补码
inc al ;再加1,(到此完成正变负,负变正)
and al,al ;最高位为1吗?(现在是负数吗)
jns down ;现在不是负数(那就是正数)就跳转
xor al,0ffh ;/否则再恢复原数仍放在al中
inc al ;\
down:
mov [bx],al ;用al的值回写数组元素()
inc bx ;数组元素地址加1
dec cl ;循环次数减1
jnz next ;CL<>0就跳转。
hlt
;结论:本段程序实现的功能是,在地址2050开始处有一10个元素
; 的字节数组,各元素为带符号数,编程完成将数组中为负
; 数的元素转换为正数元素。(或者表述为转换为绝对值..)
;+----------------------------
2.下列程序段执行后实现什么功能?
mov si,2500h;取首地址进si
mov cx,8 ;循环变量赋初值8
xor ax,ax ;ax清0
mov ax,[si] ;从数组中取一数进al
inc si ;调整si
inc si ;si再加1
dec cx ;循环次数减1
next: ;循环开始
add ax,[si] ;ax加下一个数组元素
add si,2 ;调整数组元素的地址
loop next ;(cx)=(cx)-1 ,如果(cx)<>0,则继续循环
;很明显,循环的功能是累加数组元素
;累加的结果保留在ax中
mov [2000h],ax;将累加结果写入首地址为2000h的字单元。
hlt
;结论,本段程序的功能是实现数组各元素求和,累加结果记入
; [2000h]字单元
;+----------------------------
下列程序段执行后,问:程序实现什么功能?
mov sp,2000h ;栈指针赋值
mov ax,[3000h] ;(ax) = x,假设x就是[3000h]
mov bx,08h ;(bx)=8
push bx ;/通过栈操作实现
pop dx ;|(si)=(dx)=(bx)=8
push dx ;|
pop si ;\
add ax,bx ;(ax)=(ax)+(bx)=x+8
mov cl,2 ;设置移位数
sal ax,cl ;/(ax)=4*(ax)=4(x+8)
sal si,1 ;\(si)=2*(si)=2*8=16
add ax,dx ;(ax)=(ax)+(dx)=4(x+8)+8
add ax,si ;(ax)=(ax)+(si)=4(x+8)+8+16
mov [4000h],ax ;记入存储器
hlt
结论:程序实现 y = 4(x+8)+8+16 = 4x+32+24 = 4x+56
; 注:机器数左移一位相当于机器数扩大了一倍...,当然不能出现
; 溢出问题
;+----------------------------
;下列程序段执行后问:程序执行完后,堆栈中压入了几个数?
;按压入次序写出这些数据,该程序的功能。
MB1 DB 255 ;
...
mov al,MB1 ;(al)=[MB1]
xor ah,ah ;ah清0
inc ax ;(ax)=(ax)+1=255+1=256
mov dx,10 ;设置除数为10
RL1:
div dl ;ax/dl 商在al中,余数在ah中
mov bl,ah ;/
mov bh,0 ;|ah借道bx,将余数压栈
push bx ;\
xor ah,ah ;ah清0,为进入下一循环作好准备
cmp al,0 ;商为0吗?
jnz rl1 ;不为0就再循环一次
hlt ;
结论: 本程序实现将机器数255+1转换为十进制未压缩的BCD数,
程序执行完后,堆栈中压入了3个数,压栈的顺序的6,5,2
;+-----------------------------
最后一题无聊,略。