
需要向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。等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)