logo资料库

福州大学汇编实验参考答案.doc

第1页 / 共8页
第2页 / 共8页
第3页 / 共8页
第4页 / 共8页
第5页 / 共8页
第6页 / 共8页
第7页 / 共8页
第8页 / 共8页
资料共8页,全文预览结束
12,34,56,-12,-34,-9,0,3,0,-5,3,5 0AH,0FFH,4,0,77H,88H,0F0H,0BBH ;存正数累加和 ;存负数绝对值累加和 ;存正数数据个数 ;存负数数据个数 PARA STACK DATA ARRAY SEGMENT DB DB EQU $-ARRAY COUNT DW 0 SUM1 SUM2 DW 0 CUNT1 DB 0 CUNT2 DB 0 ENDS DATA STACK1 SEGMENT STA DW 20H DUP(0) STACK1 COSEG SEGMENT ENDS ASSUME CS:COSEG,DS:DATA,SS:STACK1 START: MOV AX,DATA DS,AX MOV XOR AX,AX XOR BX,BX XOR CX,CX XOR DX,DX LEA SI,ARRAY MOV CL,COUNT LOP: TESTBYTE PTR [SI],80H JE PLUS MOV NEG CH ADD ADC INC JMP NEXT ADD ADC AH,0 INC INC SI PLUS: NEXT: CH,[SI] ; 求负数绝对值 BL,CH BH,0 DL ; 负数绝对值累加 ; 个数计数 AL,[SI] ; 正数累加 DH ; 个数计数 ; 存结果 SUM1,AX SUM2,BX CUNT1,DH CUNT2,DL AH,4CH DEC CL JNE LOP MOV MOV MOV MOV MOV INT 21H COSEG ENDS END START 2、上机题目:两个八位数的相加运算 内容: DAT 开始的单元中存放两个八位二进制数,两个数相加后结果存入 SUM 单元中。( SUM 为十六位 ) DAT DB X1,X2 SUM DW ? 无符号数 有符号数
data segment dat db 0feh,05h sum dw ? data ends code segment assume cs:code,ds:data start:mov ax,data mov ds,ax mov al,dat xor ah,ah add al,dat+1 adc ah,0 mov sum,ax code ends end start 1、上机题目:统计正数(负数)的个数 内容:DAT 开始的单元中存放 N 个字节有符号数, 统计正数的个数存入 T0 单元中;负数的个数存入 T1 单元 中; Dat DB DB T0 T1 DB X1,……,XN ? ? equ $-dat data segment dat db 12,23,-45,-82,91,64,0,-2,4,37 count t0 db ? t1 db ? data ends codesegment assume cs:code,ds:data start: mov ax,data mov ds,ax mov cx,count mov si,0 data segment dat db 0feh,05h sum dw ? data ends code segment assume cs:code,ds:data start:mov ax,data mov ds,ax mov al,dat cbw mov bx,ax mov al,dat+1 cbw add ax,bx mov sum,ax code ends end start lop: test dat[si],80h t1 t0 ; 个数计数 ; 个数计数 je plus inc jmp next inc inc si plus: next: dec cx cmp cx,0 jne lop mov ah,4ch int 21h codeends end start 2、上机题目:无符号数排序 内容:TAB 开始的单元中存放 N 个字节无符号数,请按照从大到小排序后,存入 DAB 单元中。(选作:从小到大 排序) TAB DB DAB DB X1,……,XN N DUP(?)
data segment tab db 01h,10h,05h,60h,30h,11h n equ $-tab dab db n dup(?) data ends code segment assume cs:code,ds:data start: mov ax,data mov ds,ax mov bx,0 mov cx,n q:mov al,tab[bx] mov dab[bx],al inc bx loop q mov cx,n dec cx lop: mov di,cx mov bx,0 lop1: mov al,dab[bx] cmp al,dab[bx+1] jnb next xchg al,dab[bx+1] mov dab[bx],al next: inc bx dec cx cmp cx,0 jnz lop1 mov cx,di dec cx cmp cx,0 jnz lop mov ah,4ch int 21h code ends end start 1、上机题目: 求最大数(最小数) 内容:DAT 开始的字单元中存放 N 个无符号数,求出最 大数存入 MAX 单元中。 ( 求出最小数存入 MIN 单元中 ) DAT DW X1,……,XN MAX DW ? MIN DW ? data segment dat dw 6,2,3,1,5,4,2 count equ ($-dat)/2 max dw ? min dw ? data ends code segment assume cs:code,ds:data start: mov ax,data mov ds,ax mov cx,count-1 mov si,0 mov ax,dat[si] mov bx,dat[si] j0: add si,2 cmp ax,dat[si] jnb j1 mov ax,dat[si] j1: cmp dat[si],bx jnb j2 mov bx,dat[si] j2: loop j0 mov max,ax mov min,bx mov ah,4ch int 21h code ends end start
2、上机题目:数据查找 内容:TABLE 开始的字节单元中 存放 N 个无符号数,dt 单元存放一个已知数据 X,现从 TABLE 中查找是否存在数据 X,如果存在,NO 单元存放 该数据在 TALBE 中的序号,否则 NO 单元存放 FFH 。 TABLE DB dt no DB DB X1,……,XN x ? data segment table db 55h,01h,60h,12h,22h count equ $-table dat db 0h no db ? data ends code segment assume cs:code,ds:data start: mov ax,data mov ds,ax mov cx,count mov si,0 mov al,dat lop: cmp table[si],al jz j0 inc si loop lop 1、上机题目:代码转换 j0: cmp cx,0 jnz next mov al,0ffh mov no,al jmp done next: mov ax,si mov no,al jmp done done: mov ah,4ch int 21h codeends end start 内容:用子程序设计的方法,分别把 BUF 字单元中的四个十六进制数转换为 ASCII 代码存入 MAS 开始的单元中, BUF DW X MAS DB 4 DUP(?) 并在 crt 上显示。 data segment buf dw 21ACh mas db 4 dup(?) data ends codesegment assume cs:code,ds:data main proc near mov ax,data mov ds,ax call decbin mov ah,4ch int 21h endp proc near main decbin pushdx mov si,0 mov ch,4h lop: mov cl,4h mov ax,buf rol ax,cl mov buf,ax and ax,0fh cmp al,0ah jb yes add al,7 yes: add al,30h mov mas[si],al mov dl,al mov ah,2 int 21h inc si dec ch cmp ch,0 jnz lop pop dx ret decbin endp codeends end main
做法 A data segment buf db 100 db ? db 100 dup(?) data code ends segment assume ds:data,cs:code far main proc call ascii mov ax,4ch int 21h main endp ascii proc near mov ax,data mov ds,ax mov si,offset buf mov dx,offset buf mov ah,0ah int 21h call crlf inc si mov cl, [si] mov ch,0 inc si agn: mov bl,[si] mov dl,[si] shr dl,1 shr dl,1 shr dl,1 shr dl,1 add dl,30h mov ah,2 int 21h and bl,0fh add bl,30h cmp bl,39h jl shore add bl,7 shore: mov dl,bl mov ah,2 int 21h call crlf inc si loop agn ret ascii endp crlf proc near mov dl,0dh mov ah,2 int 21h mov dl,0ah mov ah,2 int 21h ret crlf endp code ends end main main proc far mov ax,data mov ds,ax call decbin call crlf call binihex call crlf mov ah,4ch int 21h main endp decbin proc near lea dx,buf mov ah,10 int 21h ret decbin endp binihex proc near push dx xor ax,ax xor cx,cx mov si,0 mov bl,buf+1 lop1: print: mov ch,02h mov cl,04h mov al,buf[si+2] mov ah,2h int 21h dec ch cmp ch,0h jnz print call crlf inc si cmp si,bx js lop1 pop dx ret binihex endp crlf proc near mov dl,0dh mov ah,2 int 21h mov dl,0ah mov ah,2 int 21h ret crlf endp code ends end main mov ax,ms call show mov ah,4ch int 21h main endp 2、上机题目:键盘输入 内容:用子程序设计的方法,要求从键盘输入一串字母,在 CRT 上依次显示该串字母的 ASCII 代码。 做法 B data segment buf db 100 db ? db 100 dup(?) data ends code segment rol al,cl mov buf[si+2],al and ax,0fh cmp al,0ah js next add al,07h assume cs:code,ds:data next: add al,30h mov dl,al 1、上机题目:将 DAT 数组的 N 个无符号数分成两个数组,偶数数组 P 和奇数数组 M,统计并在 CRT 上显示两个数 组数据个数。 data segment P main proc far DAT DW X1,……,XN DW n dup (?) M DW n dup (?) dat dw 0021h,0001h,000ah,0003h,0004h,000bh n equ ($-dat)/2 p dw n dup (?) m dw n dup (?) ps dw ? ms dw ? mov ax,data mov ds,ax call lookfor mov ax,ps call show call clrf data ends code segment assume cs:code,ds:data
lookfor proc near mov cx,n mov si,0 mov al,0 mov bl,0 lop: test dat[si],1b jnz next mov bx,dat[si] push si mov si,ps shl si,1 inc ps mov p[si],bx pop si jmp j0 next: mov bx,dat[si] push si mov si,ms shl si,1 inc ms mov m[si],bx pop si clrf proc near mov dl,0dh mov ah,02h int 21h mov dl,0ah int 21h ret clrf endp code ends end main j0: add si,2 dec cx cmp cx,0 jne lop ret lookfor endp show proc near xor bx,bx xor cx,cx mov bx,10 nx1: xor dx,dx div bx or dx,0e30h inc cx push dx cmp ax,0 jnz nx1 nx2: pop ax int 10h loop nx2 ret show endp 2、上机题目:从键盘上输入 2 个十进制数,存入 A、B 单元 中,C = A + B,并在 CRT 上 按十进制显示 C 值。 DB ? B DB ? decibin proc near mov bx,0 newchar:mov ah,1 int 21h sub al,30h cmp al,0 jl exit cmp al,09 jg exit xchg al,bl mov cx,10d mul cx xchg al,bl add bl,al jmp newchar exit: ret decibin endp A data segment a db ? b db ? c dw ? data ends code segment assume cs:code,ds:data main proc far mov ax,data mov ds,ax call decibin mov a,bl call clrf call decibin mov b,bl call clrf call addab call show mov ah,4ch int 21h main endp nx2: pop ax int 10h loop nx2 ret show endp clrf proc near mov dl,0dh mov ah,02h int 21h mov dl,0ah int 21h ret clrf endp code ends end main C DW ? addab proc near xor ax,ax xor bx,bx mov al,a mov bx,ax mov al,b add ax,bx mov c,ax ret addab endp show proc near xor bx,bx xor cx,cx mov bx,10 nx1: xor dx,dx div bx or dx,0e30h inc cx push dx cmp ax,0 jnz nx1
3、上机题目:键盘输入 内容:用子程序设计的方法,要求从键盘输入 2 位 16 进制数,转化为 10 进制数并在 CRT 上显示。 lop4:dec si data segment ys proc near mov cx,2 mov si,0 lop3:cmp mas[si],61h ;小写字母,将 ASCII 转换为 十六进制数,其实是二进制 ;数字 jnb lop1 cmp mas[si],41h ;大写字母 jnb lop sub mas[si],30h jmp lop2 lop1:sub mas[si],57h jmp lop2 lop: sub mas[si],37h lop2:inc si loop lop3 ret endp ys put proc near xor ax,ax mov si,0 mov al,mas[si] mov bl,16 mul bl ;AL 乘 16 放入 AX 中 inc si add ax,word ptr mas[si] mov bh,10 mov si,0 lop5:div bh mov buf[si],ah ;ah 里面存余数,采用 除十取余思想,余数倒序即 为十进制数 inc si test al,1 ;测试商是否为零,为 零结束循环 jz lop4 mov ah,0 jmp lop5 mov cx,si inc cx mov ah,2 mov dl,0dh int 21h mov dl,0ah int 21h lop6:add buf[si],30h mov dl,buf[si] int 21h dec si loop lop6 ret put endp code ends end go mas db 2 dup(0) buf db 4 dup(0) data ends code segment assume cs:code,ds:data go: mov ax,data mov ds,ax call get call ys call put mov ah,4ch int 21h get proc near mov si,0 mov ah,01 int 21h mov mas[si],al inc si int 21h mov mas[si],al ret get endp buf1 db 'ABc5d6EfG','$' ct equ $-buf1 buf2 db ct dup (?) count db ? data ends code segment assume cs:code,ds:data go: mov ax,data mov ds,ax mov cx,ct dec cx mov count,0 mov si,0 3、题目:BUF1 中存入如下由大小写字符和数字字符构成的串,要求将其中的大写字符变小写,小写字符变成大写, 数字字符不变,并按序存入 BUF2 中,同时统计数字字符个数存入 COUNT 单元中,并用子程序在 CRT 上显示 COUNT 的内容。 BUF1 data segment ? put proc near DB ‘ABc5d6EfG’,'$' COUNT DB lop:cmp buf1[si],3Ah ;判断数字 BUF2 DB ‘-------------’ lop2:add buf1[si],20h ;加 20h,大写变小写 jb lop1 cmp buf1[si],5Bh ;判断大写 jb lop2 cmp buf1[si],7Bh ;判断小写 jb lop3 lop1:inc count ;数字不变,COUNT 加一统 计个数 jmp lop4 jmp lop4 lop3:sub buf1[si],20h ;减 20H,小写变大写 lop4:mov bl,buf1[si] ;buf1 到 buf2 mov buf2[si],bl inc si loop lop mov buf2[si],'$' call put mov ah,4ch int 21h add count,30h ;题目定义知,数字个数小 于 9,不用十进制数出,直 接加 30H mov ah,02 mov dl,count int 21h ret put endp code ends end go 4、题目:DAT 开始的单元中存放 n 个字节的正负数和 0,求所有负数的绝对值和存入 SUM 单元中,并统计 0 的个 数,存入 ZCOUNT 单元,用子程序在 CRT 上显示 SUM 内容。DAT DB D1,……,Dn SUM DW? ZCOUNT DB ?
data segment dat db 2,4,0,5,8,2,0,6,-2,-5,-3,0,-5,-7,-3,0,- 6,0,7,4,2,7,-5,-3 equ $-dat ct zcount db 0 sum c db 0 db 3 dup(?) jz lop2 jmp lop3 inc si dec cx jnz lop jmp lop4 lop1:neg dat[si] ;负数绝对值,负变正需要求补 data ends code segment assume cs:code,ds:data go: mov ax,data mov ds,ax mov cx,ct mov si,0 lop:test dat[si],80h ;测试正负 jnz lop1 test dat[si],0ffh ;测试零 xor ax,ax add al,dat[si] add sum,al inc si dec cx jnz lop jmp lop4 lop2: inc zcount ;零个数统计 lop3: inc si dec cx jnz lop lop7:dec si mov cx,si inc cx mov ah,2 lop6:add c[si],30h mov dl,c[si] int 21h dec si loop lop6 ret put endp code ends end go lop4:call put ; 调 用 十 进 制 输 出 子程序并输出 mov ah,4ch int 21h put proc near xor ax,ax mov al,sum mov bh,10 mov si,0 lop5:div bh mov c[si],ah inc si test al,1 jz lop7 mov ah,0 jmp lop5
分享到:
收藏