汇编语言 将20个数据的数组分成两组,正数数组P和负数数组N,并分别显示两个数组的个数

data segment
    array  dw 1,2,3,-4,5,-6,7,-8 
data ends

ext segment
	pdata dw 8 dup(?)
	ndata dw 8 dup(?)
	a db 30h       
	b db 30h
ext ends    

code segment
assume cs:code,ds:data,es:ext
start:
    mov ax,data
    mov ds,ax
    mov ax,ext
    mov es,ax 
    
    lea bx,array
    lea si,pdata
    lea di,ndata
    mov cx,8
    
T:  mov ax,[bx]
    cmp ax,0
    jg P
    mov es:[di],ax 
    add es:[a],1
    add di,2
    jmp L
 P: mov es:[si],ax 
    add es:[b],1  
    add si,2 
 
 L:add bx,2
 loop T   
 
    mov ah,2
    mov dl,es:[b] 
    int 21h
    
    mov dl,20h
    mov ah,2
    int 21h
    
    mov ah,2
    mov dl,es:[a]
    int 21h
 
    mov ax,4c00h
    int 21h
code ends
end start 

  • 3
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
好的,我明白了你的问题。这是一个比较具体的技术问题,我可以给你提供一份示例代码,但是需要你自己进行理解和实践。 首先,我们需要定义两个数组:一个存储正数,另一个存储负数。我们可以使用汇编语言的条件转移指令(Jxx)来完成这个任务。 以下是一份示例代码: ``` ; 假设 STRAING 的地址存储在 DX 中 mov bx, 0 ; 正数组元素个数 mov cx, 0 ; 负数组元素个数 ; 先读取第一个数 ; 判断正负性 mov al, [dx] or al, al ; 判断是否为 0 js negative ; 负数 jmp positive ; 正数 positive: inc bx ; 正数组元素个数加 1 jmp next_iteration ; 进行下一轮迭代 negative: inc cx ; 负数组元素个数加 1 next_iteration: inc dx ; 下一个数的地址 cmp byte ptr [dx], '$' ; 判断是否到结尾 jne loop ; 如果不是结尾,就继续循环 ; 程序到达这里,说明已经到了结尾 mov [positive_array], bx ; 把正数组元素个数保存在正数组的第一个元素 mov [negative_array], cx ; 把负数组元素个数保存在负数组的第一个元素 ret positive_array resb 1 ; 正数组 negative_array resb 1 ; 负数组 ``` 上面的代码是一个基本的结构,我们先定义了两个变量 `bx` 和 `cx`,分别表示正数组元素个数负数组元素个数。 在这个程序中,我们首先通过 `or al, al` 指令判断当前数是否为 0,如果大于 0,那么说明是正数,我们就通过 `inc bx` 指令把正数组元素个数加一,然后进行下一轮迭代。 如果当前数小于 0,那么说明是负数,我们就通过 `inc cx` 指令把负数组元素个数加一。 最后,当我们遇到一个 `$` 字符时,代表着整个数组已经被读取完毕了,我们就把正数组元素个数负数组元素个数分别存储在正数组和负数组的第一个元素中。 希望这份代码能够帮助你解决问题。如果有任何疑问,欢迎随时询问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值