注册 登录
编程论坛 汇编论坛

小白,初来乍到,请多指教

阿凡的夏天 发布于 2020-04-28 21:46, 1994 次点击
碰见个题,想了好久,也没做出来,请大神指教
定义三个字数组a,b,c ,比较a[i]与b[i]的大小,若<则使c[i]置0,若>则使c[i]置1, 若=则使c[i]置2
3 回复
#2
阿凡的夏天2020-04-29 17:27
想出来了
;定义三个字数组a,b,c ,比较a[i]与b[i]的大小,;若<则使c[i]置0,若>则使c[i]置1, 若=则使c[i]置2
DATAS SEGMENT
a dw 1,4,4,6
b dw 2,3,5,6
m dw 4 dup(?)
    ;此处输入数据段代码  
DATAS ENDS
STACKS SEGMENT
    ;此处输入堆栈段代码
STACKS ENDS
CODES SEGMENT
    ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
    MOV AX,DATAS
    MOV DS,AX
    mov es,ax
    lea si,m     
   mov bp,si   
    lea si,a     
    lea di,b
    sub di,si
    shr di,1
    mov cx,di
    mov dx,0
s:
   lea si,a
   lea di,b
   add si,dx
   add di,dx
   mov ax,word ptr[si]
   mov bx,word ptr[di]
   cmp ax,bx
   jl ok
   jg okk
   mov si,bp
   mov word ptr[si], 2
   inc bp
   inc bp
   inc dx
   inc dx
   inc di
   inc di
   loop s
   jmp next
   
ok:   
   mov si,bp   
   mov word ptr[si], 0
   inc bp
   inc bp
   inc dx
   inc dx
   inc di
   inc di
   loop s
okk:
   mov si,bp   
   mov word ptr[si], 1
   inc bp
   inc bp
   inc dx
   inc dx
   inc di
   inc di
   loop s            
next:
    MOV AH,4CH
     INT 21H
CODES ENDS
    END START
#3
Valenciax2020-04-30 07:50
这个可以简化些

程序代码:

DATAS SEGMENT

 a dw 1,4,4,6

 Len equ ($ - a) /2    ;长度
b dw 2,3,5,6

 m dw 4 dup(?)      

 result db 2,0,1    ;代表 =,<,> (等于,少于,大于)
DATAS ENDS
CODES SEGMENT
    ASSUME CS:CODES,DS:DATAS
START:
    MOV AX,DATAS
    MOV DS,AX
    mov cx,Len        ;取长度
     mov bx,0        ;初始化
next:    mov si,0        ;初始化
    mov ax,a[bx]        ;取第1值
    cmp ax,b[bx]        ;比较第2值
    jz @f            ;等于跳,si=0
    mov si,1   
    jb @f            ;少于跳,si=1
    mov si,2        ;大于,si=2
@@:    mov al,result[si]    ;以si取相应的置值(2,0,1)
    mov byte ptr m[bx],al    ;置入结果
    add bx,2        ;下一个
    loop next         ;回圈
    MOV AH,4CH
    INT 21H
CODES ENDS
    END START



将2,0,1等'置值'抽离放在data区是因为若将来这些值有任何改变,只要更改data区的资料就是,
不必更动程式.


[此贴子已经被作者于2020-4-30 07:54编辑过]

#4
阿凡的夏天2020-04-30 16:01
回复 3楼 Valenciax
1