5.13 字数组ARRAY,第一个单元为元素个数N,后面为N个元素,编写程序,把零元素从数组中清除,移动元素位置并修改第一个单元(元素个数)。
;delete the 0 from array
data segment
array dw 6,3,4,0,15,0,7
loca dw 999 ;此单元地址为结束标记
data ends
code segment
assume cs:code,ds:data
start:
mov ax, data
mov ds, ax
mov cx, array
lea bx, array+1
next: cmp word ptr[bx],0
jz move
add bx,2
dec cx
cmp cx,0
jnz next
jmp exit
move: dec array
mov di,bx
mnext:
cmp di,offset loca
ja next
mov ax, [di+2]
mov [di],ax
add di,2
cmp di,offset loca
jnb next
jmp mnext
exit: mov ah,4ch
int 21h
code ends
end start
5.14 下表为奥运会获金牌前十名国家的成绩统计表,请编写程序,统计并填写表中的合计栏数据。
; 先逐行求小计,再按列求合计。
data segment
array db 1,0,1,? ;设简单数据
db 1,1,0,?
db 1,1,0,?
db 1,1,1,?
db 1,1,1,?
db 1,1,1,?
db 1,1,1,?
db 1,1,1,?
db 1,1,1,?
db 1,1,1,?
org 30h
sumvd db ?,?,?,? ;存放按列求的合计数
org 40h
loca dw ? ;存放array的第一行地址
data ends
code segment
assume cs:code,ds:data
start:
mov ax, data
mov ds, ax
mov ax, 0
mov cx, 10
lea bx, array
sumh: mov di, 3
sum3: add al, [bx]
inc bx
dec di
jnz sum3
mov [bx],al ; 存放行的小计
mov ax,0
inc bx
loop sumh
; 下面按列求合计
lea bx, array
mov loca,bx
lea si, sumvd
mov cx,10
mov di,4
sumv3:
mov ax,0
mov bx,loca
sumv: add al, [bx]
add bx,4
loop sumv
mov [si],al
mov cx,10
inc si
inc loca
dec di
jnz sumv3
exit: mov ah,4ch
int 21h
code ends
end start
6.1 过程定义如下,补充括号中的指令。
code segment
assume cs:code
main proc far
( PUSH DS )
( XOR AX,AX )
( PUSH AX )
…
…
…
ret
main endp
code ends
end main
6.2 补充下列程序括号中的指令,使得程序对堆栈的操作全部利用程序中定义的TOS堆栈,并画出程序执行后堆栈TOS中的数据。
data segment
dw 100 dup(?)
tos label word
data ends
code segment
assume cs:code,ss:data
main proc far
( MOV AX,DATA )
( MOV SS,AX )
( LEA SP,TOS )
push ds
xor ax, ax
push ax
call far ptr suba
… ;假定此处指令的地址为cs=3400h,ip=30h
…
…
code ends
end main
6.3 以下两个独立程序模块,互相用到对方的变量和标号,你认为哪一个是主模块?程序有没有错误?应该如何修改?
答:m1.asm是主模块,因为它有call m2,但没有说明外部符号,而m2必须是过程名,var4,lab2也没有说明外部符号。var1 ,var2没有说明为PUBLIC。应加上:
EXTRN m2:FAR,var4:WORD
PUBLIC var1, var2,lab1
并修改data segment为data segment PUBLIC
同理M2.asm应加上:
EXTRN var1:byte,var2:word
extrn lab1:FAR
PUBLIC t603b, var4
并修改data segment为data segment PUBLIC
以上完成主要修改,但程序依然有错,请仔细检查操作数类型是否匹配。
;m1.asm 如下:
data segment
var1 db ?
var2 dw ?
var3 dw ?
data ends
code1 segment
assume cs:code1,ds:data
main proc far
start: …
mov ax, data
mov ds, ax
…
call m2
lab1: mov ax, var4
…
jmp lab2 ;去掉此指令
…
main endp
code1 ends
end start
;m2.asm 如下:
data segment
var4 dw ?
var5 dw ?
data ends
code2 segment
assume cs:code2,ds:data
m2 proc far
…
add dx,var1 ;var1为字节类型
add dx,var2
jmp lab1
…
M2 endp
code2 ends
end
6.4 主程序从键盘输入N位二进制数到缓冲区,用子程序将其转换为二进制数串显示。主程序和子程序共用数据缓冲区。
data segment
buff db 9,?,9 dup (?)
data ends
code segment
assume cs:code,ds:data
main proc far
start:
mov ax, data
mov ds, ax
lea dx, buff
mov ah, 10
int 21h
call outp汇编语言结束指令
exit: mov ah,4ch
int 21h
main endp
outp proc near
mov ah,2
mov dl,10
int 21h
mov cl, buff+1
mov ch,0
lea bx, buff+2
out1: mov dl, [bx]
mov ah, 2
int 21h
inc bx
loop out1
ret
outp endp
code ends
end start
6.5 主程序从键盘输入一个字符串到BUFF,再输入一个字符到AL,用子程序在字符串BUFF中查是否存在该字符,如果到,显示发现的字符位置。用寄存器传递要查的字符。
;search
data segment
mess1 db 13,10, 'input string:$'
mess2 db 13,10, 'input a char:$'
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论