汇编里adc ch,0是个什么指令

汇编里adc ch,0是个什么指令,第1张

需要向16位的CX寄存器中加一个8位数的时候,需要先将8位数加到CL中,再对CH使用上述的带进位加0指令,将CL加的时候可能产生的进位位加上。

若不这样,丢失低8位加法时的进位,结果就不对了。

adc dl,0就是要把进位加进来。

adc是带进位的加法,就是dl+0+cf,结果放在dl中。加0等于没加啊,所以,目的就是要把进位加到dl中。

这段程序的功能是将bl的内容以二进制形式显示出来。把bl左移一位,最高位移到cf中,然后用adc dl,0把进位和30H相加,得到相应的ascii码,再用二号功能显示出来。循环执行8次。

assume

cs:code,ds:data

data

segment

data1

db

12h,34h,56h

;按照高高低低的顺序保存在内存中的,所以是563412h,下同

data2

db

0abh,0cdh,0efh

ans

dd

data

ends

code

segment

start:

mov

ax,data

mov

ds,ax

mov

bx,offset

ans

mov

di,offset

data1

mov

si,offset

data2

mov

ax,[di]

add

ax,[si]

mov

[bx],ax

mov

ax,[di+1]

adc

ax,[si+1]

;用adc带进位加法就能算高位的值了

mov

[bx+1],ax

mov

ax,[di+2]

adc

ax,[si+2]

mov

[bx+2],ax

mov

ax,0

adc

ax,0

;3字节的值加上有进位,所以要算第4字节的

mov

[bx+3],ax

mov

ah,4ch

int

21h

code

ends

end

start

计算的是563412h+efceabh的值,结果是14602bdh,结果无误。可以自己用debug试试

你把这两个程序合起来改下就差不多咯!时间忙 只能把自己以前学的子程序给你咯

; :1602显示

LCD_RS EQU P20

LCD_RW EQU P21

LCD_EN EQU P22

LCD_DATA EQU P0

;

ORG 0000H

AJMP MAIN

ORG 0030H

;

MAIN:

MOV SP,#60H

ACALL LCD_INIT ;LCD初始化

MAIN1:

ACALL CLR_LCD ;清LCD

MOV A,#90H ;在第一行第17列的位置

ACALL LCD_CMD

MOV DPTR,#LINE1 ;第一行字符串的起始地址送入DPTR。

ACALL WRITE

MOV A,#0D0H ;在第二行第17列的位置

ACALL LCD_CMD

MOV DPTR,#LINE2 ;第二行字符串的起始地址送入DPTR。

ACALL WRITE

MOV R3,#10H ;向左移动16格

LOOPA:

MOV A,#18H ;字符同时左移一格

ACALL LCD_CMD

MOV R5,#03H ;延时375MS

ACALL DELAY125MS

DJNZ R3,LOOPA

ACALL DELAY4 ;延时16s

ACALL DELAY4

MOV R4,#02H ;设置闪烁次数

ACALL FLASH ;开始闪烁

AJMP MAIN1

LINE1:

DB "YALONG:",00H

LINE2:

DB "welcome you!",00H

;

;LCD初始化设定子程序

;

LCD_INIT:

ACALL DELAY5MS ;延时15MS

ACALL DELAY5MS ;等待LCD电源稳定

ACALL DELAY5MS

MOV A,#38H ;162显示,57点阵,8位数据

ACALL LCD_CMD_NC ;不进行LCD忙检测

ACALL DELAY5MS

MOV A,#38H ;162显示,57点阵,8位数据

ACALL LCD_CMD_NC ;不进行LCD忙检测

ACALL DELAY5MS

MOV A,#38H ;162显示,57点阵,8位数据

ACALL LCD_CMD_NC ;不进行LCD忙检测

ACALL DELAY5MS

MOV A,#08H ;显示关

ACALL LCD_CMD ;进行LCD忙检测

MOV A,#01H ;清除屏幕

ACALL LCD_CMD ;进行LCD忙检测

MOV A,#0CH ;显示开,关光标

ACALL LCD_CMD ;进行LCD忙检测

RET

;

;清LCD子程序

;

CLR_LCD:

MOV A,#01H ;清除屏幕

ACALL LCD_CMD ;进行LCD忙检测

RET

;

;写指令数据到LCD

;RS=L,RW=L,D0-D7=指令码,E=高脉冲

;

LCD_CMD:

CALL CHECKBUSY

LCD_CMD_NC:

CLR LCD_RS

CLR LCD_RW

MOV LCD_DATA,A

SETB LCD_EN

NOP

NOP

NOP

NOP

CLR LCD_EN

RET

;

;写显示数据到LCD

;RS=H,RW=L,D0-D7=数据,E=高脉冲

;

LCD_WDATA:

ACALL CHECKBUSY

SETB LCD_RS

CLR LCD_RW

MOV LCD_DATA,A

SETB LCD_EN

NOP

NOP

NOP

NOP

CLR LCD_EN

RET

;

;检测LCD控制器忙状态

;读数据

;RS=L,RW=H,E=H,输出:D0-D7=数据

;LCD_DATA7=1,LCD忙,等待。LCD_DATA7=0,LCD闲,可以进行读写 *** 作。

;

CHECKBUSY:

PUSH ACC

MOV LCD_DATA,#0FFH

CLR LCD_RS

SETB LCD_RW

SETB LCD_EN

BUSYLOOP:

NOP

JB LCD_DATA7,BUSYLOOP

CLR LCD_EN

POP ACC

RET

;

; 发送字符串子程序

;

WRITE:

PUSH ACC

WRITE1:

CLR A

MOVC A,@A+DPTR

JZ WRITE2

INC DPTR

ACALL LCD_WDATA

JMP WRITE1

WRITE2:

POP ACC

RET

;

;闪烁子程序

;

FLASH:

MOV A,#08H ;关闭显示

ACALL LCD_CMD

ACALL DELAY4

MOV A,#0CH ;开显示,关闭光标

ACALL LCD_CMD

ACALL DELAY4

DJNZ R4,FLASH

RET

;

;延时5MS子程序

;LCD初始化使用

;

DELAY5MS:

MOV R6,#10

DL1:

MOV R7,#249

DL2:

DJNZ R7,DL2

DJNZ R6,DL1

RET

;

;延时125MS子程序

;字符串移动时使用

;

DELAY125MS:

DL3:

MOV R6,#250

DL4:

MOV R7,#249

DL5:

DJNZ R7,DL5

DJNZ R6,DL4

DJNZ R5,DL3

RET

;

;延时800MS子程序

;闪烁时使用

;

DELAY4:

MOV R5,#40

DL6:

MOV R6,#100

DL7:

MOV R7,#100

DL8:

DJNZ R7,DL8

DJNZ R6,DL7

DJNZ R5,DL6

RET

;

ENd

; ADC0809子程序

; 引脚定义

ADC_EOC EQU P20

ADC_CS EQU P21

ADC_RD EQU P22

ADC_WR EQU P23

ADC_DATA EQU P0

ORG 0000H

AJMP MAIN

ORG 0030H

MAIN:

SETB ADC_EOC

SETB ADC_WR

SETB ADC_RD

SETB ADC_CS

CLR ADC_CS ;START and ALE is H

CLR ADC_WR

NOP

NOP

NOP

SETB ADC_WR

SETB ADC_CS

NOP

JB ADC_EOC,$ ; JNB ADC_EOC,$

CLR ADC_CS

CLR ADC_RD

MOV ADC_DATA,#0FFH

MOV A,ADC_DATA

SETB ADC_RD

SETB ADC_CS

CJNE A,#00H,BELL

INC A

BELL:

MOV R5,A

BELL1: ACALL DELAY

DJNZ R5,BELL1

CPL P27

AJMP MAIN

DELAY:

MOV R7,#02H

D1:

MOV R6,#0FFH

DJNZ R6,$

DJNZ R7,D1

RET

END

        CODE  SEGMENT

              ASSUME    CS:CODE

           A  DD        12345678H

           B  DD        8765432H

           C  DW        8765H

           D  DD        98765432H

           X  DQ        0

      START:  PUSH      CS

              POP       DS

              PUSH      CS

              POP       ES

              MOV       DX,WORD PTR B+2

              MOV       AX,WORD PTR B

              MOV       BX,C

              DIV       BX

              MOV       BX,AX

              MOV       AX,WORD PTR A+2

              MUL       BX

              ADD       WORD PTR X+2,AX

              ADC       WORD PTR X+4,DX

              ADC       WORD PTR X+6,0

              MOV       AX,WORD PTR A

              MUL       BX

              ADD       WORD PTR X,AX

              ADC       WORD PTR X+2,DX

              ADC       WORD PTR X+4,0

              ADC       WORD PTR X+6,0

              MOV       DX,WORD PTR D+2

              MOV       AX,WORD PTR D

              ADD       WORD PTR X,AX

              ADC       WORD PTR X+2,DX

              ADC       WORD PTR X+4,0

              ADC       WORD PTR X+6,0

              MOV       AH,4CH

              INT       21H

        CODE  ENDS

              END       START

; A*(B/C)+D→X

; 其中,变量是32位无符号数,变量C是16位无符号数,x为64位无符号数,B/C为整除

以上就是关于汇编里adc ch,0是个什么指令全部的内容,包括:汇编里adc ch,0是个什么指令、请问汇编程序、(汇编语言)编写一个程序,实现两个三字节无符号数DATA1和DATA2的相加,结果送四字节变量ANS。等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/9848245.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-02
下一篇2023-05-02

发表评论

登录后才能评论

评论列表(0条)

    保存