编写并运行一个汇编语言程序,要求在首地址为Table的数组中存放10个带符号数,编写程序统计正数、负数和零的个数,并分别存入Gcount、Lcount和Zcount单元
根据现在的问答规则,为了防止白白回答问题而被耍,所以只能是先采纳后回答。谢谢谅解。
;将有符号数分组并分行显示(数据绝对值小于100)
data segment
ARRAY dw 1,2,-1,3,4,-2,-3,4,5,-6
P_ARY dw 10 dup(20h) ;正数
N_ARY dw 10 dup(20h) ;负数
str1 db 'P_ARY = '
p db 0,6 dup(20h)
str2 db 'N_ARY = '
n db 0,6 dup(20h),10,13,'$';用来存放负数个数
data ends
code segment
assume cs:code,ds:data
start:
mov ax,data
mov ds,ax
mov bx,offset ARRAY
mov si,offset P_ARY
mov di,offset N_ARY
mov cx,10
s:
mov ax,[bx]
Test ah,10000000b ;相当于与,但不保存结果
jz s0 ;跳到正数处理
not ax ;负数处理,求反加1得绝对值
inc ax
call get10 ;得到可显示10进制ASCII码
mov [di],ax
add di,2
add n,1
jmp next
s0: call get10 ;正数直接
mov [si],ax
add si,2
add p,1
next: add bx,2
loop s
;显示
mov si,offset P_ARY
mov di,offset N_ARY
mov ah,0eh ;中断调用功能参数
mov cx,0
mov cl,P
s1:
mov al,[si]
cmp al,30h
jz gw1 ;不显示零
int 10h
gw1: inc si
mov al,[si]
int 10h
inc si
mov al,20h
int 10h
loop s1
mov al,10
int 10h
mov al,13
int 10h
mov cl,n
s2:
mov al,'-'
int 10h
mov al,[di]
cmp al,30h
jz gw2 ;不显示零
int 10h
gw2: inc di
mov al,[di]
int 10h
inc di
mov al,20h
int 10h
loop s2
mov al,10
int 10h
mov al,13
int 10h
add n,30h
add p,30h
mov ah,09h
mov dx,offset str1
int 21h
mov ah,4ch
int 21h
get10 proc
aam ;BCD码调整,会将 al扩展 十位放到ah中,个位放到al中
or ax,3030h ;将数字转化成ascii码
xchg al,ah ;逆序以便于显示al中是高位,ah是低位
ret
get10 endp
code ends
end start
讨厌伸手党
这么简单的作业,请思考后,有不会的地方在上来提问