汇编高手请进:设计一个简单的逻辑运算器

“简单运算器设计” 数字逻辑课程设计 100 160~

挺复杂的,得慢慢来。

计算机能显示的是ascll码,你计算出来的结果是55,对应是是7的ascll码,最后显示为7。
想要正常显示需要将结果转换成对应的ascll码。
暂时就发现了这个错误

; 本程序通过编译,运行正确
Code Segment
Assume CS:Code,DS:Code
; -------------------------------------
; 功能:显示指定地址(Str_Addr)的字符串
; 入口:
; Str_Addr=字符串地址(要求在数据段)
; 用法: Output Str_Addr
; 用法举例:Output PromptStr
Output MACRO Str_Addr
lea dx,Str_Addr
mov ah,9
int 21h
EndM
; -------------------------------------
; 功能:输出一个字符
; 入口:dl=要显示的字符
Output_Chr proc Near
push ax
mov ah,02h
int 21h
pop ax
ret
Output_Chr endp
; -------------------------------------
; 功能:输出回车换行
Output_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
Output_CTLF endp
; -------------------------------------
Prompt_Str db 'Please input a digital(0-9):$'
Start: push cs
pop ds ;使数据段与代码段同段
@@Input: Output Prompt_Str ;提示输入一位十进制数字
mov ah,1 ;接收一个字符
int 21h
cmp al,1bh ;Esc?
jz Exit_Proc ;是,结束程序
cmp al,'0' ;<'0'?
jb @@Input[8] ;不是有效字符,重新输入
cmp al,'9' ;>'9'?
ja @@Input[8] ;不是有效字符,重新输入
call Output_CTLF ;输出一个回车、换行
and al,0fh ;转换成而进制数
not al ;取反,逻辑非操作
and ax,0fh ;与高4位无关,屏蔽掉
aaa ;ASCII码加调整指令AAA(Ascii Adjust After Addition)
or ax,3030h ;转换成ASCII码字符
cmp ah,'0' ;ah='0'?
jz $+7
mov dl,ah
call Output_Chr ;显示一个字符
mov dl,al
call Output_Chr
call Output_CTLF
call Output_CTLF
jmp @@Input ;接收下一个数字
Exit_Proc: mov ah,4ch ;结束程序
int 21h
Code ENDS
END Start ;编译到此结束

既然是个位数,那很容易啊

数字输入进来是以ASCII码保存,转成2进制数只要把高4位置0即可,因为十进制数x的ASCII码即为3xh。比如输入后,ASCII码保存在AL中,那么执行一条指令“AND AL, 0FH”即可。

不过两个数怎么进行“非”运算?“非”运算是指对一个数的每位进行取反,只有一个操作数,如何两个数进行“非”运算?如果是“与”、“或”、“异或”等双操作数运算那没问题,很简单,把前面输入的两个转换后的数分别存在两个寄存器里,然后执行一条相应的指令即可,比如“XOR AL, AH”

最后是显示结果。根据前面的运算,结果已经保存在AL中,要输出,先要把它转换成ASCII码。转换很简单,跟第一步相反,把高4位置为3即可,即“OR AL, 30H”。接下来调用中断输出AL即可。

用C写一个按位取反的再看它的汇编,用来研究研究吧.

逻辑运算非貌似只需要一个数吧?
还是说两个数分别非运算?

c语言设计一个简单的计算器程序
答:#include<stdio.h>//计算器 voidmenu()//自定义的菜单界面 { printf("---\n");printf("请输入你的选择\n");printf("1.+\n");printf("2.-\n");printf("3.*\n");printf("4./\n");printf("---\n");} intmain(){ int...

用汇编语言编写一个小程序(比如hello,word!)请懂的人帮忙提供源码_百度...
答:另外,像NULL,MB_OK都是一些常量,这样的常量有很多,还有很多的结构,如果在我们的程序中一开始都写这么多的东西,可能一下子就把你吓怕啦,也容易出错,更不便于看程序的主要部分。hutch整理的Windows.inc包含了WIN32编程所需要的常量和结构体的定义,我们可简单的用一个include指令将这些常量和结构...

用汇编语言设计一个程序,求10个无符号数中的最大值。并将最大值存入变 ...
答:源文件来自《汇编子程序库》,注释来自:http://zhidao.baidu.com/question/148383731.html25) 标号: MMS功能:求单字节十六进制有符号数据块的极值入口条件:数据块的首址在DPTR中,数据个数在R7中。出口信息:最大值在R6中, 地址在R2R3中;最小值在R7中,地址在R4R5中。影响资源:PSW、A、B、R1~R7 堆栈需求:...

用switch语句编程设计一个简单的计算器程序
答:include <stdio.h> int main( ){ double a, b;char op;scanf("%lf%c%lf", &a, &op, &b);switch (op){ case '+':printf("%lf + %lf = %lf\n", a, b, a + b);break;case '-':printf("%lf - %lf = %lf\n", a, b, a - b);break;case '*':printf("%...

汇编语言的高手请进,问几个简单题目
答:1 XOR AL,AL INC AL NEG AL INC AL MOV BL,7FH ADC AL,BL 答:上述程序运行后,AL=80H,CF=0 2 下面程序段是判断寄存器AH和AL中第3位是否相同,如相同,AH置0,否则AH置非0。试把空白处填上适当的指令(一个空白只填一条指令)。答: xor ah,al AND AH,08H jz ZERO...

有关汇编的一个简单的问题,会的进
答:MOV AX,[BX] ;以寄存器间接寻址方式,将BX寄存器所指向的存储单中的数据转储到AX寄存器中。BX原来是指向第一个字(即10)的,加6之后,便指向第四个字,即为40。要注意:一个字(DW类型)的存储单元,包含两个字节(DB类型)的存储单元。所以字类型的10和40之间的地址差值是6个字节,所以BX从...

菜鸟求救~汇编高手请进~~一个简单的问题~
答:DATAS SEGMENT ORG 3500H NUM DW 20ABH ORG 350AH ASCINFO DB 0,0,0,0,"$"DATAS ENDS STACKS SEGMENT DB 100 DUP(?)STACKS ENDS CODES SEGMENT ASSUME CS:CODES,DS:DATAS,SS:STACKS START:MOV AX,DATAS MOV DS,AX MOV CX,4 MOV AX,[NUM]MOV SI,OFFSET ASCINFO AG: PUSH CX MOV ...

求助:一道简单的汇编语言程序设计
答:8086汇编语言,使用masm5汇编器编译通过 data segment score db 30,40,50,60,70,80,90,67,70 ;9个学生的分数 num_under60 db 0 ;60以下的人数 num_60to69 db 0 ;60到69的人数 num_70to79 db 0 ;70到79的人数 num_80to89 db 0 ;80到89的人数 num_90to99 db 0 ;90到99的人数 ...

51单片机汇编语言-请编写程序将内部RAM 40H到4FH 中的16个数据按从小...
答:MOV A, @R0 ; 取前一个数 INC R0 MOV B, @R0 ; 取后一个数 CJNE A, B, L3 ; 前面的数 与 后面的数 比较, 前-后 L3: ;判断、处理 JC N_JH ; 后面的数 大于 前面的数,不交换 XCH A,B ...

用C语言设计一个简单计算器
答:else if(p=='*') multiplication(a,b,c);else if(p=='/') div(a,b,c);else puts("没有注册这个运算符号\n"); }以上是设计的一个简易计算器。可以进行相应的加减乘除。简介:C语言是一种计算机程序设计语言,它既具有高级语言的特点,又具有汇编语言的特点。它由美国贝尔研究所...

IT评价网,数码产品家用电器电子设备等点评来自于网友使用感受交流,不对其内容作任何保证

联系反馈
Copyright© IT评价网