首页 > 代码库 > 汇编大题

汇编大题

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,cl

loop 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,data

mov 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 ax
cmp cx,8
jne L1
mov dh,dl

L1:



xor al,al
rol 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,data

mov ds,ax

mov hexdata,xxx

call fact


fact proc

push cx

mov ch,hexdata

and ch,0fh

add ch,30h

cmp ch,09h

hna hex1

add ch,07h

hex1:

mov ascdata,ch

mov ch,hexdata

mov cl,4

shr ch,cl

add ch,30h

cmp ch,39h

jna hex2

add ch,07h

hex2:

mov ascdata+1,cl

pop 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及其后继机型还可作双字操作。