我也是刚学汇编,下面的程序貌似很混乱,但是基本思路是没错的!而且能运行正确!
我没有用子程序的方法做,因为刚学到子程序那里,对它的调用有点不了解,调了好几次都错了,一气之下就直接做成这样,呵呵!
程序有些冗余,可能也有些小错误,望见谅!
Dataseg segment
da dw 327,-4798,555,-5359,5354,347,-4554,4321,65,-2
num dw 10
num1 dw ?
Dataseg ends
STACK1 segment PARA STACK
DW 20H DUP(0)
STACK1 ends
Codeseg segment
Assume cs:codeseg,ds:dataseg,ss:STACK1
main:
mov ax,dataseg
mov ds,ax
xor cx,cx ;1.先将全部的负数变成正数
lea bx,da
mov cx,num
next:
mov ax,[bx]
test ax,8000h
jz p1 ;正数时
neg ax ;负数时取补
mov [bx],ax
p1:
add bx,type da
loop next ;完成转换负数
lea bx,da ;2.寻找里面的最大值
mov ax,[bx]
xor cx,cx
mov cx,num
add bx,type da
dec cx
q:
cmp ax,[bx]
ja l
mov ax,[bx]
l:
add bx,type da
loop q
lea bx,num1
mov [bx],ax ;完成最大值寻找,并将其放进num1中
; 如果直接输出那个数字,默认是ascii输出的
mov ax,num1 ;3.将那个最大值按数字这样输出
mov bx,10
xor cx,cx
mov cx,0
lop1:
mov dx,0
div bx ;字符型除法,被除数放dx(高位),ax(低位),所以要设dx为0
;这是为了防止溢出
add dx,48 ;将余数加上ascii中48(即0),使其能输出正确的数
push dx ;将它压入堆栈
inc cx
cmp ax,0
je end1
ja lop1
end1:
lop2:
pop bx ;将刚刚压入堆栈中的数逐个输出
mov dx,bx
mov ah,02h
int 21h
loop lop2
mov ah,4cH
int 21H
codeseg ends
End main
该用什么算呢
异或 还是什么
我也忘记了 好久好久了