汇编——循环

1、有关独立变量的
eg : z=((x+y)*8-x)/2
编程思想:
x+y: 用add就可以实现
-x: 用sub实现
*8: 可以使用左移指令shl移动3次,就是乘以8(因为移位的次数超过一,所 以可以先将移位的次数3送进cl寄存器中)
/2: 右移指令shr

data segment
x dw 8
y  dw 8
result dw ?
data ends
stack segment
dw 10 dup(0)
stack ends
code segment
assume cs:code,ss:stack,ds:data
start:mov ax,data
      mov  ds,ax
      mov  ax,x
      add  ax,y
      mov  cl,3
      shl  ax,cl
      sub  ax,x
       shr  ax,1
       mov  result,ax
       mov  ah,4ch
       int 21h
  code ends
  end start

我们可以手算结果为60,转换为十六进制就是003C,在DOXBOX中运行后可看到AX里的数正确。
在这里插入图片描述
2、循环
XHBC1:有一个字数组a,编程将其复制到b数据区
编程思想:就没啥说的哈,就是用loop咯

data segment
a  dw 0,1,2,3,4,5,6,7,8,9
b  dw 10 dup(0)
data ends
stack segment para stack
dw 10 dup(0)
stack ends
code segment
assume cs:code,ds:data,ss:stack
start: mov ax,data
       mov ds,ax
       mov si,0
       mov di,0
try:   mov cx,b-a
       mov ax,a[si]               
       mov b[di],ax
       inc si
       inc di
       loop try          // 一条LOOP指令相当于dec cx        jnz  <标号> 两条指令的组合
  mov ah,4ch
  int 21h
  code ends
  end start

截图就不截了吧,自己运行。
分析:
运行完所有程序后,从数据段的起始地址13FC:0000查看该段内存为
00 00 01 00 02 00 03 00 04 00 05 00 06 00 07 00 08 00 09 00 00 00 01 00 02 00 03 00 04 00 05 00 06 00 07 00 08 00 09 00
可见b数组对应的内存被复制了a数组的信息,实验结果正确。

XHBC2: 有a、b是2个字节数据区,其长度都相同,编程将a、b数据区对应元素作为字的高、低两字节存入字数据区c中对应位置。

data segment
a db 3,2,5,7,4
b db 2,7,1,3,6
c dw 10 dup(0)
data ends
stack segment para stack
dw 10 dup(0)
stack ends
code segment
assume cs:code,ds:data,ss:stack
start:mov ax,data
      mov ds,ax
      mov si,0
      mov di,0
      mov cx,5
 try: mov ah,a[si]        // 变址寻址方式,将a数据区对应元素作为字的高字节存在ah中
      mov al,b[si]        //变址寻址方式,将b数据区对应元素作为字的低字节存在al中
      mov c[di],ax
      inc si
      inc di
      inc di
      loop try
   mov ah,4ch
   int 21h
   code ends
   end start

分析:
运行完所有程序后,从数据段的起始地址076A:0000查看该段内存为
03 02 05 07 04 02 07 01 03 06 02 03 07 02 01 05 03 07 06 04
可见a,b数据区对应元素已作为字的高、低两字节存入字数据区c中对应位置,画横线的数据为c数据区的对应元素,达到题目要求。

***XHBC3:***编程求字数据区a中所有正数之和,结果存于字x中。

data segment     
a dw 5,-5,2
count equ $-a
x dw ?
data ends
stack segment
dw 10 dup(0)
stack ends
code segment
assume cs:code,ds:data,ss:stack
start: mov ax,data
       mov ds,ax
       mov ax,0
       mov bx,0
       mov si,0
       mov cx,count
       sar  cx,1              //  count是字节变量,但是数据是字变量
   try: mov ax,a[si]
       cmp ax,0
       jg a1
       inc si
       inc si
       loop try
  a1:  add bx,ax
       inc si
       inc si
      loop try
  mov x,bx
mov ah,4ch
  int 21h
  code ends
  end start

分析:运行完所有程序后,从数据段的起始地址076A:0000查看该段内存为
05 00 FB FF 02 00 07 00
可见5,-5,2存入内存中,程序运行后,正数之和是7,结果正确。

这三道循环题其实是俺们老师之前的作业,哈哈哈,以后遇到了再补吧,✌

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

柯糖

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值