实验 4 [bx]和loop的使用

一、实验结论

1.实验内容1

综合使用 loop,[bx],编写完整汇编程序,实现向内存 b800:07b8 开始的连续 16 个 字单元重复填充字数据0403H。

(1)代码如下:

assume cs:code
code segment
     mov ax,0b800h
     mov ds,ax
     mov ax,0403h
     mov bx,07b8h
     mov cx,16
s:mov [bx],ax
  inc bx
  inc bx
  loop s
  mov ax,4c00h
  int 21h
 
code ends
end
(2)用masm进行运行,运行结果如下

(3)将源代码程序中字数据0403H→修改为0441H,再次运行

 

 

2.实验内容2

 综合使用 loop,[bx],编写完整汇编源程序,实现向内存 0:200~0:23F 依次传送数据 0~63(3FH)

(1)

代码如下:综合使用loop, [bx], mov实现

assume cs:code

code segment
     mov ax,0020h
     mov ds,ax
     mov bx,0h
     mov cx,40h
     mov ax,0
s:
  mov [bx],ax
  add ax,1h
  inc bx
  loop s
  mov ax,4c00h
  int 21h
 
code ends
end

 利用masm集成操作软件进行编译

用debug查看储存单元,观察是否成功写入

运行时没有出现结果,用debug查看内存单元发现,正常写入内存数据,代码运行成功

(2)利用栈的特性,综合使用 loop,push 实现

代码如下:

assume cs:code
code segment
     mov ax,0020h
     mov ss,ax
     mov sp,40h
     mov bh,3fh
     mov bl,3eh
     mov cx,20h
s:push bx
  add bh,-2
  add bl,-2
    loop s
  mov ax,4c00H
  int 21H
code ends
end

改动过程中出现的问题:

①由于8086cpu的栈读入按字(两个字节输入)所以入栈操作需要进入一个字的数据,然后把其中的两个字节数据分别减少2

②小端法的输入,push bx时(bx=bh+bl),将bh放到栈最底部,bl在bh的内存单元上面(例如bh的地址为10002H,bl的地址为10001H)

所以要注意bh,bl的初始数值

③由于按字读入的原则,cx=40h/2=20h。

对比两种方法,循环语句显然更容易让人理解,而用栈语句进行操作,操作效率更高,能一次输入两个字节。

 3.实验内容3

源代码

assume cs:code

         code segment

         mov ax,cs  因为cs为储存指令的段地址

         mov ds,ax

         mov ax,0020H

         mov es,ax

         mov bx,0

         mov cx,0017H  此处为代码的长度,用debug观察寄存器内容获得(cx=001c,减去后面的5个不计入其中的字节)

         s:mov al,[bx]

           mov es:[bx],al

           inc bx

           loop s

           mov ax,4c00H

           int 21H

code ends

end

用debug进行调试

用u命令反汇编

可以看到,相应的代码内容已经复制到了0:200处,成功

 二、总结与体会:

①熟悉了loop和【bx】的应用,了解了循环语句的应用方法

②了解了栈入栈时的每个字节输入的先后顺序,对小端法的印象更深刻了

③熟悉了如何进行代码段的复制,cs和寄存器:【bx】的应用

 

转载于:https://www.cnblogs.com/xihongqing/p/9971738.html

好的,以下是使用汇编语言实现LED3闪烁实验的步骤: 1. 首先,需要设置GPIO端口,将LED3连接到对应的GPIO端口上。在STM32F4开发板上,LED3对应的GPIO端口为PD13,因此需要将PD13设置为输出模式。 2. 接下来,需要设置系统时钟,在这里我们选择使用HSI时钟,将系统时钟设置为16MHz。 3. 然后,需要实现一个延时函数,用来控制LED3的闪烁频率。这里我们选择使用循环计数的方式实现延时函数。 4. 最后,实现LED3闪烁功能的主程序。在主程序中,先将LED3设置为关闭状态,然后循环执行将LED3设置为打开状态、延时、将LED3设置为关闭状态、再次延时的操作,以实现LED3的闪烁。 下面是具体代码实现: ``` ; STM32F4 LED3闪烁汇编程序 ; 设置GPIO端口PD13为输出模式 LDR R0, =RCC_AHB1ENR LDR R1, [R0] ORR R1, #0x08 STR R1, [R0] LDR R0, =GPIOD_MODER LDR R1, [R0] ORR R1, #0x400000 STR R1, [R0] ; 设置系统时钟为16MHz LDR R0, =RCC_CR LDR R1, [R0] ORR R1, #0x01 STR R1, [R0] LDR R0, =RCC_CFGR LDR R1, #0x00 STR R1, [R0] ORR R1, #0x02 STR R1, [R0] LDR R0, =RCC_CR LDR R1, [R0] ORR R1, #0x02 STR R1, [R0] ; 等待系统时钟稳定 LDR R0, =0x100000 WAIT: SUBS R0, #1 BNE WAIT LDR R0, =FLASH_ACR LDR R1, [R0] ORR R1, #0x30 STR R1, [R0] ; 延时函数 DELAY: LDR R0, =0x1000 LOOP1: SUBS R0, #1 BNE LOOP1 BX LR ; 主程序 MAIN: LDR R0, =GPIOD_BSRR LDR R1, #0x2000 STR R1, [R0] ; 延时 BL DELAY LDR R0, =GPIOD_BSRR LDR R1, #0x20000000 STR R1, [R0] ; 延时 BL DELAY B MAIN ``` 注意:具体的寄存器地址和数值需要根据所使用的STM32F4开发板和所连接的LED3端口进行调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值