汇编程序简介

汇编程序编程流程及调试介绍
本文介绍了汇编编程的大概流程,包括编写源程序、编译连接成可执行文件及运行。还讲解了汇编源程序,包含伪指令、汇编指令、标号和程序返回等内容。此外,说明了可用debug调试编译连接后生成的exe文件,并列举了debug调试可能用到的命令。
1.汇编编程大概流程
1)编写源程序
记事本等工具编写汇编代码;
保存为xx.asm;
 
2)编译连接
将源程序编译连接成可执行文件xx.exe;
例如:用masm编译连接源a.asm;
    编译:将 .asm 文件编译成 .obj 文件;
masm a.asm
    连接:将 .obj文件连接成 .exe文件;
    连接的作用:
        1】可将多个源文件连接成一个可执行文件
        2】如果源文件调用了库文件,将库文件和源文件连接成一个可执行文件;
        3】.obj文件还不能直接执行,需要连接处理后才能生成可执行文件;
link a.obj
    编译连接:也可以同时进行编译连接
ml a.asm
 
3)运行
运行生成的可执行文件;
例如:运行a.exe
a
 
2.汇编源程序
一段简单的汇编代码:
assume cs:demo
demo segment
    mov ax,0123H
    mov bx,0456H
    add ax,bx
    add ax,ax
    mov ax,4c00H
    int 21H
demo ends
end
 
汇编代码由两种指令组成:
    1】伪指令    ->不编译成机器码,由编译器执行,用来控制编译工作
    2】汇编指令    ->编译成机器码,然后由cpu来执行
 
1)伪指令
segment 和 ends    ->是一对伪指令;用来定义一个段;格式为:段名 segment ... 段名 ends
demo segment
...
demo ends
 
end    ->汇编程序的结束指令;编译器在编译过程中,遇到了伪指令end将结束编译;
 
assume    ->将段寄存器和代码段关联;例如:段寄存器cs 和 代码段 demo关联:
assume cs:demo
 
2)汇编指令
汇编指令将在编译连接完成后变为机器码;
例如下图所示:
 
3)标号
标号就是段的名称;
例如demo segment 中的 demo就是标号;
标号将最终转换成一个段的段地址;
 
4)程序返回
在一个单任务操作系统中,例如dos;
程序p2想要执行,必须有一个程序p1将p2从可执行文件中加载到内存,然后将cpu的控制权交给p2;
p2执行时p1暂停,当p2执行完后,再将cpu的控制权交给p1,p1继续执行;
当一个程序结束后,将cpu的控制权交给使它运行的程序的过程称为程序返回;
程序返回的实现代码:
mov ax,4c00H
int 21H
 
3.debug调试
可以用debug来调试 .asm编译连接后生成的 .exe文件;
例如:
debug a.exe
在dos中,运行一个程序时,由command将可执行文件加载入内存,设置cs:ip指向该程序的入口;
当cs:ip指向程序入口时,command将cpu控制权交给程序,直到程序结束;
为了观察程序执行的过程,可以利用debug;
debug会将程序加载入内存,设置cs:ip指向程序的入口,但是不会放弃cpu的控制权;
debug调试时可能用到的命令:
    r    ->查看寄存器信息;
    u    ->查看下一条指令;
    t    ->单步执行;
    p    ->int 21 这条指令需要用 p 来执行;
    q    ->退出debug;
 
 

转载于:https://www.cnblogs.com/ShiningArmor/p/11049841.html

<think>好的,用户想了解如何通过74HC595控制8个LED灯,每次循环亮两个灯的汇编程序。我需要先回忆一下74HC595的工作原理。它是一个8位串行输入、并行输出的移位寄存器,通常用于扩展输出端口。用户需要的是每次循环点亮两个灯,这涉及到如何正确发送数据和控制信号。 首先,我得确认74HC595的三个主要控制引脚:数据(DS)、移位寄存器时钟(SH_CP)和存储寄存器时钟(ST_CP)。数据是按位串行输入,每次移位时钟上升沿时数据移入,当存储时钟上升沿时,数据从移位寄存器传输到存储寄存器,输出到并行引脚。 接下来要考虑的是如何生成两个灯亮的模式,并且实现循环。每次需要发送一个8位的数据,其中两个位为高电平,其余为低。例如,第一个状态是00000011,接下来是00000110,依此类推,每次左移一位,直到循环回来。 然后需要考虑汇编程序的结构,可能需要初始化端口,设置控制引脚的方向,然后进入一个循环,不断发送不同的数据模式,并添加适当的延迟,让LED显示可见。这里可能需要使用循环移位指令,或者通过预先定义好的数据表来加载每个状态的值。 此外,延迟子程序是关键,确保每个状态保持足够的时间,否则变化太快,人眼无法察觉。可能需要计算指令周期,根据微控制器的时钟频率来确定延迟循环的次数。 还要注意数据发送的顺序,因为74HC595是高位先入还是低位先入?通常数据是从高位(Q7)开始移入,所以发送字节时可能需要从最高位开始依次发送每位。 可能的步骤是: 1. 初始化控制引脚为输出。 2. 进入主循环,加载第一个数据模式(如0x03)。 3. 发送该数据到74HC595。 4. 调用延迟函数。 5. 左移数据,并处理循环,比如使用带进位的循环移位,或者当数据超过0xC0时重置为0x03。 6. 重复步骤2-5。 需要检查每个步骤的汇编实现,例如如何移位数据,如何处理循环后的复位,以及如何正确控制SH_CP和ST_CP的时序。发送数据时,每个位需要先设置DS,然后产生一个SH_CP的上升沿,最后在所有位发送完后,产生ST_CP的上升沿更新输出。 可能的错误点包括:时序不符合74HC595的要求,数据位移顺序错误,或者延迟时间不合适导致闪烁太快。需要确保每个时钟脉冲的持续时间足够,特别是在低速的微控制器上,可能不需要额外延迟,但为了可靠性,可能还是要添加少量NOP指令。 最后,代码的结构需要清晰,注释明确,方便用户理解和修改。可能需要用寄存器来保存当前的数据模式,使用循环和移位操作来更新数据,并正确管理控制引脚的输出状态。</think>通过74HC595控制8个LED灯循环亮两个灯的汇编程序可分为以下步骤: --- ### **1. 硬件原理** - **74HC595引脚**: - `DS`(串行数据输入) - `SH_CP`(移位寄存器时钟) - `ST_CP`(存储寄存器时钟) - **工作流程**:将8位数据逐位通过`DS`输入,通过`SH_CP`上升沿移位,最后通过`ST_CP`上升沿输出到并行端口。 --- ### **2. 程序逻辑** 1. **初始化**:设置控制引脚为输出模式。 2. **数据模式**:每次发送两个相邻LED亮起的8位数据(如 `00000011`→`00000110`→…→`11000000`)。 3. **循环移位**:通过左移操作实现模式切换,末尾补位处理循环。 4. **延时控制**:保持每个状态可见时间。 --- ### **3. 汇编代码框架(以8051为例)** ```assembly ; 定义控制引脚 DS BIT P1.0 ; 数据引脚 SHCP BIT P1.1 ; 移位时钟 STCP BIT P1.2 ; 存储时钟 ORG 0000H MAIN: MOV R0, #03H ; 初始模式: 00000011 (二进制) LOOP: MOV A, R0 CALL SEND_DATA ; 发送数据到74HC595 CALL DELAY ; 延时 RL A ; 左移一位 (例: 00000011 → 00000110) CJNE A, #0C0H, NEXT ; 判断是否到末尾模式 11000000 MOV A, #03H ; 重置为初始模式 NEXT: MOV R0, A SJMP LOOP ; 发送8位数据子程序 SEND_DATA: MOV R1, #8 ; 8位数据 SEND_LOOP: RLC A ; 将最高位移入进位位C MOV DS, C ; 发送当前位到DS SETB SHCP ; SH_CP上升沿移位 CLR SHCP DJNZ R1, SEND_LOOP SETB STCP ; ST_CP上升沿输出 CLR STCP RET ; 延时子程序 DELAY: MOV R2, #50 DELAY1: MOV R3, #200 DELAY2: DJNZ R3, DELAY2 DJNZ R2, DELAY1 RET END ``` --- ### **4. 关键点说明** 1. **数据模式生成**: - 初始值 `03H`(二进制`00000011`)表示前两个LED亮。 - 每次左移(`RL A`)生成新模式,末尾通过判断 `0C0H`(`11000000`)重置。 2. **时序控制**: - `SH_CP`和`ST_CP`需严格按上升沿触发。 - 延时函数控制LED切换速度。 3. **扩展性**: - 修改初始值`R0`可改变起始模式(如 `05H`亮第1和第3个LED)。 --- ### **5. 优化建议** - 使用查表法预存所有模式,避免动态计算。 - 调整延时函数参数匹配实际需求(如 `DELAY`中的`R2`和`R3`)。 如有具体芯片型号或硬件连接差异,需调整引脚定义和时序参数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值