1.用主,子程序结构编写一个程序,计算sun = 1!+2!+3!+4!+5!
答案:
; 数据段
data segment
sum dw 0
data ends
;程序段
code segment
assume cs:code,ds:data
start:
mov ax,data
mov ds,ax
xor ax,ax
xor cx,cx
mov cl,5
xunhuan1:
call fact
add sum,ax
loop xuanhuan1
mov ah,4ch
int 21h;
fact proc
push cx;xor ax,ax
mov al,1
xunhuan 2:
mul al,clloop xunhuan2
pop cx
ret
fact endp
code ends
end start
2 .将一个给定的二进制数按位转换成相应的ascII码字符串,送到指定的存储单元并显示,如二进制数1001 0011 转换成字符串‘1001 0011’。要求将转换过程写成子程序,
并且子程序应具有较好的通用性,而且必须能实现对8位和16位二进制数的转换。
答案:
data segment
num8 db 93h
num16 dw 0abcdh
ascbuf db 20 dup (0)
data ends
code segment
assume ds:data,cs:code,ss:stack
start:
mov ax,datamov ds,ax
xor dx,dx
mov dl,num8
mov cx,8
lea di,ascbuf
call fact
mov [di],byte ptr odh
mov [di+1],byte ptr 0ah
mov [di+2],byte ptr ‘$‘
lea dx,ascbuf
mov ah,09h
int 21h
mov dx,num16
mov cx,16
lea di,ascbuf
call fact
mov [di],byte ptr 0dh
mov [di+1],byte ptr 0ah;
mov [di+2],byte ptr ‘$‘
lea dx,ascii
mov ah,09h
int 21h
fact proc
push axcmp cx,8
jne L1
mov dh,dl
L1:
xor al,alrol dx,1
rcl al,1
add al,30h
mov [di],al
inc di
loop L1
pop ax
ret
fact endp
code ends
end start
3.用存储单元传送参数,编写一个子程序,将二位十六进制数转换为对应的ascII码,并说明主程序是如何调用这个子程序的。
答案:
data segment
hexdata db ?
ascdata db 2 dup (?)
data ends
code segment
assume cs:code,ds:data,ss:stack
start:
mov ax,datamov ds,ax
mov hexdata,xxx
call fact
fact proc
push cxmov ch,hexdata
and ch,0fh
add ch,30h
cmp ch,09h
hna hex1
add ch,07h
hex1:
mov ascdata,chmov ch,hexdata
mov cl,4
shr ch,cl
add ch,30h
cmp ch,39h
jna hex2
add ch,07h
hex2:
mov ascdata+1,clpop cx
ret
fact endp
code ends
end start
逻辑指令
逻辑左移SHL(Shift Logical Left)和逻辑右移SHR(Shift Logical Right)
格式:SHL(或SHR) OPR,CNT
逻辑左移/右移指令只有它们的移位方向不同,移位后空出的位都补0。
算术指令
SAL(shift arithmetic left) 算术左移
格式:SAL OPR,CNT
含义: 算术左移SAL把目的操作数的低位向高位移,空出的低位补0.
(指将要移位的操作数换成二进制表示方法,如62H为01100010B.移位时只是寻常理解中的将这些二进制位逐个向左或向右移,移走的数根据操作符决定舍弃或者放入空出的位置,空出的位置根据操作符决定补0或者放入移走的数)。
SAR(shift arithmetic right) 算术右移
格式:SAR OPR,CNT
算术右移SAR把目的操作数的高位向低位移,空出的高位用最高位(符号位)填补。
如62H二进制表示法为01100010B,最高位为0,无论右移多少位左边都用0补上。如果最高位是1,则都用1补上。
循环移位指令
循环左移ROL(Rotate Left)和循环右移ROR(Rotate Right)。
格式:ROL(或ROR) OPR,CNT
循环左移/右移指令只是移位方向不同,它们移出的位不仅要进入CF,而且还要填补空出的位。可以理解为蛇咬尾巴型循环。
带进位的循环左移RCL(Rotate Left Through Carry)和带进位的循环右移RCR(Rotate Right)。
格式:RCL(或RCR) OPR, CNT
带进位的循环左移/右移指令只有移位的方向不同,它们都用原CF的值填补空出的位,移出的位再进入CF。
注:受影响的标志位:CF和OF。
以上算术,循环和逻辑移位指令均可以作字或字节的操作,386及其后继机型还可作双字操作。
汇编大题