实验4 [bx]和loop的使用

 

四、实验结论

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

(1)编写汇编源程序loop1.asm

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)对源程序 t1.asm 进行汇编、连接、运行;

step1:编译;

step2:连接;

step3:运行;

运行程序之后会在屏幕上出现16个红色爱心,这个就是在显存中存储数据,我们所存入的0403h就代表着一个红色爱心的字符。


如果将0403h变为0441h,重新编译、连接和运行之后得到如下结果:

由此可以猜测,04应该是控制红色的数据,后面两个03控制的是爱心字符,41控制的是字符A;


 

注:我利用了debug进行调试,运行之后查看了b800:07b8开始的连续内存如图:

但是发现内存中的数据并没有改变为0403h,而且此段内存为显存;


 

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

(1)编写汇编源程序loop2.asm;

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

(2)对源程序 t1.asm 进行汇编、连接、运行;

step1:编译;

step2:连接;

step3:运行;

运行之后屏幕上没有任何显示;


以下操作是进入debug环境进行调试的:

(1)在debug中运行loop2.exe文件并查看当前各个寄存器中的值;

(2)我们通过u命令进行反汇编;

(3)用g命令执行到mov ax,4c00h之前;

(4)用t命令单部执行;

(5)下一步即将执行int 21h,接下来用p命令执行;

注:如果用g命令执行到int 21h之前,则会发生如下情况:

即cx的值没有发生任何改变;


 

任务三: 下面的程序功能是将mov ax,4c00h之前的指令复制到内存0:200处,补全程序。上机调试,跟踪运行结果。

assume cs:code
code segment
    mov ax,076ah
    mov ds,ax
    mov ax,0020h
    mov es,ax
    mov bx,0
    mov cx,14
      s:mov al,[bx]
    mov es:[bx],al
    inc bx
    loop s
    mov ax,4c00h
    int 21h
code ends
end

 

根据任务二,进行反汇编可以得知"mov ax,4c00h"之前的机器码的存储位置是076a:0~076a:0014,现在需要将之前的指令复制到内存0:200处,只需要将076a:0~076a:0014这段内存中的机器码复制到一0:200开始的内存空间即可。

(1)当前偏移地址为076a,所以将数据传入段寄存器CS中;

(2)由于此段内存空间有14个字节单元,所以执行14次循环;

一、对源程序 t1.asm 进行汇编、连接、运行;

注:Required parameter missing 的原因是什么?

二、进入debug进行调试

step1:在执行任务二之后查看当前代码的机器码所存储的位置;

step2:运行copy.exe文件并查看当前各个寄存器的值;

step3:进行反汇编;

step4:利用g命令执行;

step5:利用t命令和p命令执行;

step6:查看0:200之后的字节;

可以看出我们已经将数据存入了0:200开始的内存;

 

转载于:https://www.cnblogs.com/Sun-Yiwen-blog/p/9981165.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是使用汇编语言实现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、付费专栏及课程。

余额充值