8086汇编源程序调试

8086汇编源程序调试,第1张

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指令源 *** 作数与目的 *** 作数的寻址方式等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

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

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

发表评论

登录后才能评论

评论列表(0条)

    保存