8086汇编语言 简单的程序 ,只写显存0b800H ;为什么没有显示,请教了

8086汇编语言 简单的程序 ,只写显存0b800H ;为什么没有显示,请教了,第1张

MOV BX,6

把6,送到显存,能显示什么呀?

改成:

MOV BX,41H

试试看。

楼主的写入,显示的位置在屏幕的左上角,

楼主给出的,却没有包括这个位置。

看看:

>

CODE SEGMENT ;;代码段开始

ASSUME CS:CODE ;;代码段地址和CS段寄存器关联

START:MOV AL,0ABH ;;START是一个标签, 将 *** 作数0ABH 放在寄存器AL中

MOV CL,4 ;;将4放在寄存器CL中

ROL AL,CL ;;将AL中的数循环左移4位 左移的位数时根据cl的值来决定

MOV AX,4C00H ;;21号中断的4c号功能用于退出程序返回执行权给 *** 作系统

INT 21H ;;调用中断21h, 退出程序 不写这个你的程序运行后dos就会死住无法继续 *** 作

CODE ENDS

END START

assume cs:cseg

cseg segment

  hextab db '0123456789ABCDEF'

  A dd 11118888H

  b dd 33339444H

  c dd 0

start:

  mov ax, cseg

  mov ds, ax

  mov ax, word ptr a

  add ax, word ptr b

  mov word ptr c, ax

  mov ax, word ptr a+2

  adc ax, word ptr b+2

  mov word ptr c+2, ax

  ;16进制显示结果

  lea bx, hextab

  mov ah, 0eh

  ;高16位

  mov dx, word ptr c+2

  mov cx, 404h

c1:

  rol dx, cl

  mov al, dl

  and al, 0fh

  xlat

  int 10h

  dec ch

  jnz c1

  ;低16位

  mov dx, word ptr c

  mov cx, 404h

c2:

  rol dx, cl

  mov al, dl

  and al, 0fh

  xlat

  int 10h

  dec ch

  jnz c2

  mov ah,4ch

  int 21h

cseg ends

end start

;======================

DISP_STR MACRO X ;宏定义

MOV DX, OFFSET X

MOV AH, 9

INT 21H

ENDM

;----------------------

DATA SEGMENT ;数据段

MSG1 DB 13, 10, 'Please Input : $'

MSG3 DB 13, 10, 'The HEX is : $'

x DW ;存放新输入数据

DATA ENDS

;----------------------

CODE SEGMENT ;代码段

ASSUME CS: CODE, DS: DATA

START:

MOV AX, DATA

MOV DS, AX

;--------------------------------

IN_LOOP:

DISP_STR MSG1 ;宏调用,提示 Please Input :

;--------------------------------

MOV x, 0 ;数据清零

_INX:

MOV AH, 1 ;输入字符

INT 21H

;--------------------------------

CMP AL, 13 ;回车

JE _IN_END ;是则结束输入

CMP AL, '0'

JB IN_LOOP ;小于'0',不是数字

CMP AL, '9'

JA IN_LOOP ;大于'9',不是数字

SUB AL, '0'

MOV CL, AL

MOV CH, 0

MOV AX, x

MOV BX, 10 ;老数据乘以10

MUL BX

ADD AX, CX ;加上新数据

MOV x, AX ;保存

CMP AX, 99

JA IN_LOOP

JMP _INX

;--------------------------------

_IN_END:

DISP_STR MSG3 ;宏调用,提示 The HEX is :

MOV AX, x

MOV BX, 16

MOV CX, 0

D_1:MOV DX, 0

DIV BX

ADD DL, '0'

CMP DL, 3AH

JB ZZZ

ADD DL, 7

ZZZ:

PUSH DX

INC CX

CMP AX, 0

JNE D_1

MOV AH, 2

D_2:POP DX

INT 21H

LOOP D_2

;--------------------------------

MOV AH, 4CH

INT 21H

;--------------------------------

CODE ENDS

END START

;=====================

1、程序如下:

code segment

assume cs:code, ds:code, ss:code

org 100h

main: mov si,offset x ;取数组中第一个元素的内存地址

mov cx,100 ;数组元素个数

cld ;以下使用lodsb来获得各元素值,为此先清除方向标志

xor ah,ah ;因x内全部为无符号数,所以将ah设为0,以便累加(根据 _fmlyht 意见从循环内移出以提高代码效率)

lab1: lodsb ;从ds:si处取一个字节放入al中,同时si增1即指向下个元素

add sum,ax ;累加

loop lab1 ;循环,前面对cx的赋值规定了循环次数为100次

int 20h ;循环结束后sum中为总和,此处用int 20h退出

x db 100 dup () ;定义100个字节型元素的数组,但不指定初值

sum dw 0 ;sum的初值为0,在程序代码部分中没有对该变量进行初始化,所以会使用这里定义的值为总和的初值

code ends

end main

2、代码如下:

cmp ax,bx ;比较ax与bx

jge lab2 ;若ax>=bx则转至lab2,带符号数比较须使用jg(e)/jl(e)/jng/jnl等指令

xchg ax,bx ;根据 _fmlyht 意见,将ax与bx交换,如此,ax中为两者的较大值,bx为较小值

lab2: cmp ax,cx ;执行到此时,ax中有最初时ax与bx中较大者,这时再比较ax与cx

jge lab3 ;方法与前次类似,至lab3时ax将存有原来三者中最大的数

xchg ax,cx ;没有跳转的话需将cx中较大的值与ax中较小的值交换以使ax中含最大值

lab3:

;至此ax中已是三者中的最大值,下面代码是为完成中间值与最小值的排序,使三者从大到小分别存放于ax、bx、cx。原题无此要求,可去掉。

cmp bx,cx

jge lab4

xchg bx,cx

lab4:

;至此,ax>=bx>=cx

----

谢谢楼下 _fmlyht 朋友指正,已在此答案中改进并注明。

通常8086用汇编程序编写,通常用wmd86。

通俗来说,用C语言编程来控制8086是顺理成章的事情,比如从前的TurboC、后来的borlandC,以及现在的VC++等编译后生成的可执行代码都是X86上运行的,如果一定要在8086CPU上运行,则直接指定CPU类别为8086即可。

code segment

assume cs:code

start: mov ax,2ab0h

mov ds,ax

mov ax,03abh

mov es,ax

mov si,1000h

mov di,1008h

mov cx,8192

cld

rep movs

mov ax,4c00h

int 21h

code ends

end start

以上就是关于8086汇编语言 简单的程序 ,只写显存0b800H ;为什么没有显示,请教了全部的内容,包括:8086汇编语言 简单的程序 ,只写显存0b800H ;为什么没有显示,请教了、求一个程序,微机原理,8086汇编语言,实现一个简单实用功能,如时钟显示、请分析这道8086汇编语言程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址: http://outofmemory.cn/zz/10213480.html

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

发表评论

登录后才能评论

评论列表(0条)

保存