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中查找是否存在该字符,如果找到,显示发现的字符位置。用寄存器传递要查找的字符。
6.6 编写程序,从键盘输入一个字符串到BUFF,用子程序统计各字符出现的次数。
6.7 主程序从键盘输入一个八位的二进制数,对其作求补操作,用子程序对求补后的值以二进制形式显示。
6.8 主程序从键盘输入两个四位的十六进制数A和B,用子程序作十六进制计算A+B,并显示计算结果。
6.9 某字数组为有符号数,第一个单元为元素个数N,后面为N个元素,编写通用子程序,求数组元素中的最大值,并把它放入MAX单元。

