
S SEGMENT STACK
DW 80 DUP()
S ENDS
D SEGMENT
X DB 10,,10 DUP()
D ENDS
C SEGMENT
ASSUME SS:S,CS:C,DS:D
MOV AX,D
MOV DS,AX
MOV DX,OFFSET X
MOV AH,10d
INT 21H
MOV DL,0DH
MOV AH,2
INT 21H
MOV DL,0AH
MOV AH,2
INT 21H
xor bx,bx
LEA SI,X+1
sub cx,cx
mov cl,[si]
inc si
rotate:
cmp [si],'A'
jl next1
cmp [si],'Z'
jg next1
inc bh
next1:
loop rotate
mov dl,bh
cmp dl,0
jz exit:
mov ah,2h
INT 21H
exit:
mov ah,2h
mov dl,0
int 21h
MOV AH,4CH
INT 21H
C ENDS
END
//流水灯
#include "reg52h"
#define LED_PORT P3void
delay(unsigned char time)
{
unsigned char i,j,k; for(i=0;i>1;
halfbytel=halfbytel<<1; delay(10); } }}
例如:
1、亮4个灯、暗4个灯,1亮1暗均匀分布且稳定不变;
2、亮1个灯,暗7个灯,从上到下轮流点亮每一个灯,每次只亮一个灯,循环间隔约2秒;
3、亮2个灯,暗6个灯,一个灯从上往中间轮流点亮,另一个灯从下往中间轮流点亮,循环间隔约1秒。
4、采用ROR、ROL循环移位语句(p77)及 LOOP语句(p81),实现一个灯从第1个循环点亮到第8个,从第8个循环点亮至第1个,一直上下循环。
扩展资料:
Intel 8086拥有四个16位的通用寄存器,也能够当作八个8位寄存器来存取,以及四个16位索引寄存器(包含了堆栈指标)。资料寄存器通常由指令隐含地使用,针对暂存值需要复杂的寄存器配置。它提供64K8位元的输出输入(或32K 16 位元),以及固定的向量中断。大部分的指令只能够存取一个内存位址,所以其中一个 *** 作数必须是一个寄存器。运算结果会储存在 *** 作数中的一个寄存器。
参考资料来源:百度百科-汇编程序
记得当初自己学8086寻址时很轻松,大概是因为我C的基础还可以(指针部分我很自信)。所以呢,如果你没有学过C语言的话,还是先学好C吧。看看《C primer plus》,再看看《C和指针》,《C陷阱与缺陷》,接着看汇编,看王爽的《汇编语言》(8086汇编),接着杨季文的《80x86汇编语言程序设计》(重点是dos下80386保护模式汇编),如果对汇编实在感兴趣,看罗云彬的《Windows环境下32位汇编语言程序设计》。
(1)MOV DI,[STR1]
(4)MOV AX,[STR]
MOV BX,[STR+1]
1MOV [STR+1],AX
MOV [STR],BX;
2PUSH AX
PUSH BX
POP BX
POP AX;
3XCHG AX,BX
别的汇编语言,我不了解。Intel 8086/8088汇编语言编译器开始时所默认的整数进制为十进制。指令:MOV AX,25中的25,指十进制的25。
可以用进制伪指令RADIX来改变默认的进制。
伪指令RADIX用来设置整数的缺省进制,宏汇编开始时所默认的整数进制为十进制。该伪指令的使用格式如下:
RADIX exp
其中:伪指令前面要用点‘’开始,exp的值必须是区间[2, 16]内的一个整数。
该伪指令说明其下面整数的默认进制为exp。如果某整数已显式地表明了其进制,则该默认进制对其不起作用。在源文件中,可以使用多个RADIX伪指令来分别说明其后整数的默认进制,但为了避免引起不必要误会,我们不提倡这样去做。
例如:
radix 8
B1 DB 10, 11, 12 ;这三个数是八进制数
DB 10D ;这数是十进制数,因为它已用'D'明确说明而不使用缺省进制
…
radix 10
MOV AX, 1234 ;1234是十进制数
MOV AX, 1234H ;1234H是十六进制数
1、编两个通用过程完成将AX中存放的二进制数转换成压缩型BCD码以及将BCD码转换成二进制数。
; 本程序通过编译,运行正确。
Code Segment
Assume CS:Code,DS:Code
; -----------------------------------------
; 功能:将AX中的二进制数转换成压缩型BCD码
; 入口:AX=16位二进制数(因为压缩BCD码最大为:9999H,所以,AX的二进制值不能大于270FH)
; 出口:AX=转换后的压缩型BCD码
Binary_BCD Proc Near
push dx
push cx
push bx
push di
mov @@Temp_Save,0
mov @@Temp_Save[2],0 ;将临时两个字存储单元置0
mov bx,10
lea di,@@Temp_Save[3]
cld
@@Divide: xor dx,dx
div bx
mov [di],dl ;保存余数
dec di
test ax,0ffffh
jnz @@Divide
mov cl,4
mov ax,@@Temp_Save[2]
xchg ah,al
shl al,cl
shl ax,cl
mov dl,ah
mov ax,@@Temp_Save
xchg ah,al
shl al,cl
shl ax,cl
mov al,dl
pop di
pop bx
pop cx
pop dx
ret
@@Temp_Save dw 2 dup()
Binary_BCD EndP
; -----------------------------------------
; 功能:将AX中的压缩型BCD码转换成二进制数
; 入口:AX=压缩型BCD码
; 出口:AX=转换后的16位二进制数
BCD_Binary Proc Near
push dx
push cx
push bx
mov dx,ax
mov bx,10
mov cl,4
shr ah,cl
xchg ah,al
cbw
push dx
mul bx
pop dx
and dh,0fh
xchg dh,dl
push dx
xor dh,dh
add ax,dx
mul bx
pop dx
xchg dh,dl
xor dh,dh
push dx
shr dx,cl
add ax,dx
mul bx
pop dx
and dl,0fh
add ax,dx
pop bx
pop cx
pop dx
ret
BCD_Binary EndP
; -----------------------------------------
Start: push cs
pop ds
push cs
pop es ;使数据段、附加段与代码段同段
mov ax,3456
call Binary_BCD ;将AX中的二进制数转换成压缩型BCD码
call BCD_Binary ;将AX中的压缩型BCD码转换成二进制数
Exit_Proc: mov ah,4ch ;结束程序
int 21h
Code ENDS
END Start ;编译到此结束
2、在附加段中有一个数组,首地址为BUFF,数组中第一个字节存放了数组的长度编一个程序在数组中查找0,找到后把它从数组中删去,后续项向前压缩,其余部分补0。
; 本程序通过编译,运行正确
Code Segment
Assume CS:Code,DS:Code
BUFF db 10,56,78,35,0,89,51,63,0,76,123
Start: push cs
pop ds
push cs
pop es ;使数据段、附加段与代码段同段
cld
lea si,BUFF ;数组首地址→si
lodsb ;读数组长度
xor ah,ah
push ax
pop cx ;数组长度→cx
Find_Zero: lodsb ;数组元素读入累加器al
cmp al,0 ;是否为0
jnz Next_One ;不是0,跳转,处理下一个元素
; -----------------------------------------
; 找到0,把它从数组中删去,后续项向前压缩,其余部分补0。
push si
pop di
dec di
push di
push cx
dec cx
rep movsb
mov byte ptr [si-1],0
pop cx
pop si
; -----------------------------------------
Next_One: loop Find_Zero
Exit_Proc: mov ah,4ch ;结束程序
int 21h
Code ENDS
END Start ;编译到此结束
3编程序统计学生的数学成绩,分别归类90分~99分,80分~89分,70分~79分,60~69,及60分以下,并将各段的人数送入内存单元中。
; 本程序通过编译,运行正确
Code Segment
Assume CS:Code,DS:Code
; -----------------------------------------
; 功能:输出回车换行
enter_CTLF proc Near
push ax
push dx
mov ah,02h
mov dl,0dh
int 21h
mov dl,0ah
int 21h
pop dx
pop ax
ret
enter_CTLF endp
; -----------------------------------------
; 功能:把AL中的二进制无符号数转换成显式的十进制ASCII码
; 入口:AL=二进制数;di=转换后的ASCII保存地址
; 出口:无
Dec_ASCII Proc Near
push si
push cx
push bx
push di
mov bl,10
xor cx,cx
lea di,@@Temp_Save[3]
cld
@@Divide: xor ah,ah
div bl
or ah,30h
mov [di],ah
dec di
inc cx
test al,0ffh
jnz @@Divide
push di
pop si
inc si
pop di
pop bx
push di
rep movsb
mov byte ptr [di],'$'
pop di
pop cx
pop si
ret
@@Temp_Save db 4 dup()
Dec_ASCII EndP
; -----------------------------------------
Score db 56,69,84,82,73,88,99,63,100,80,0,10,80,100,90,73,43,60,63,72,88,42,58,99,100,89,65,61,74,84,79,2,60,61,62,62,66,82,79,71,62,63 ; 成绩单
Elements equ ($-Score)/Type Score ;元素个数
Score_Tab db 6 dup(0) ; 各分数段计数
Resault db '00---59: '
Temp_STr db 4 dup ('$')
Score100 db '====100: '
Start: push cs
pop ds
push cs
pop es ;使数据段、附加段与代码段同段
cld
lea si,Score ; 成绩首地址
mov cx,Elements ;成绩数目
mov dl,10 ; 用于除10
Read_Score: lodsb ; 提取成绩
div dl ; 除10
cmp al,5 ; >5,及格
jg $+4
mov al,5 ; <=5,不及格
sub al,5 ; 减5,分数段计数地址偏移量
cbw ;
push ax
pop bx
inc Score_Tab[bx] ; 计数增1
loop Read_Score ; 循环,统计下一个成绩
; 显示统计结果
mov bl,59h
mov cx,5
lea si,Score_Tab ;各分数段计数数组首地址
lea di,Temp_STr
lea dx,Resault ; 统计结果字符串地址
List_Resault:
lodsb ;读入计数值
call Dec_ASCII
mov ah,9 ; 显示统计结果
int 21h
call enter_CTLF
mov al,bl
add al,1
daa
mov bl,al
push cx
mov cl,4
xor ah,ah
shl ax,cl
shr al,cl
or ax,3030h
xchg ah,al
mov word ptr Resault,ax
mov al,bl
add al,9
mov bl,al
xor ah,ah
shl ax,cl
shr al,cl
or ax,3030h
xchg ah,al
mov word ptr Resault[5],ax
pop cx
loop List_Resault
push si
push di
lea si,Score100
lea di,Resault
lea cx,Temp_STr
sub cx,di
rep movsb
pop di
pop si
lodsb ;读入计数值
call Dec_ASCII
mov ah,9 ; 显示统计结果
int 21h
Exit_Proc: mov ah,4ch ;结束程序
int 21h
Code ENDS
END Start ;编译到此结束
以上就是关于8086汇编源程序调试全部的内容,包括:8086汇编源程序调试、8086 汇编 亮2个灯,暗6个灯,一个灯从上往中间轮流点亮,另一个灯从下往中间轮流点亮,循环间隔约1秒。、汇编语言8086指令源 *** 作数与目的 *** 作数的寻址方式等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)