c语言和汇编语言混合编程,键盘输入4个十进制数,用汇编语言计算这四
DATA SEGMENT
STR1 DB 'INPUT A HEX NUM: $'
HEX DB 5 ;计划输入的字符个数(含回车符)
NNN DB 0 ;存放实际输入的字符个数
DB 5 DUP(?)
BIN DW ? ;输入数字的二进制形式的存放单元
ERR DB 0AH, 0DH, ' ERROR !'
DB 0AH, 0DH, ' I HAVE NO TIME TO PLAY WITH YOU ! $'
STR2 DB 13, 10, 'BINARY IS: $'
DATA ENDS
;--------------------------------------------
STACK SEGMENT PARA STACK 'STACK'
DB 100 DUP(?)
STACK ENDS
;--------------------------------------------
CODE SEGMENT
ASSUME CS:CODE, SS:STACK, DS:DATA
START:
MOV AX, DATA
MOV DS, AX
MOV AX, STACK
MOV SS, AX
LEA DX, STR1 ;'INPUT A HEX NUM'
MOV AH, 9 ;显示字符串
INT 21H
LEA DX, HEX
MOV AH, 10 ;等着输入四位HEX数
INT 21H
;---------------------------------------
;下面进行转换
MOV BIN, 0 ;先把二进制数字单元清零
LEA SI, HEX + 2;取输入字符串的首地址
MOV CH, NNN ;取输入字符的个数,用来控制循环处理的次数
CONV:
MOV BL, [SI] ;取来一个字符
CMP BL, 0DH ;和回车符进行比较
JZ END0 ;是, 即结束
CMP BL, '0'
JB ERROR ;小于'0'转移
CMP BL, 'F'
JA ERROR ;大于'F'转移
CMP BL, '9'
JNA A2B ;不大于'9', 就去变换
CMP BL, 'A'
JNB A2B ;不小于'A', 就去变换
JMP ERROR ;其它符号都是错误
;---------------------------------------
A2B:
SUB BL, 30H ;ASC-->BIN
CMP BL, 10
JB A2B_END
SUB BL, 07H ;ASC-->BIN
A2B_END:
;---------------------------------------
MOV BH, 0 ;弄成16位数
PUSH CX
MOV AX, BIN ;把原来的数字乘以16
MOV CX, 16
MUL CX
ADD AX, BX ;加上新输入的
MOV BIN, AX ;存结果,这就是二进制数
INC SI
POP CX
DEC CH ;处理次数减一
JNZ CONV ;非零转移
;---------------------------------------
DISP:
LEA DX, STR2 ;'BINARY IS: $'
MOV AH, 9 ;显示字符串
INT 21H
;---------------------------------------
MOV AX, BIN ;取来数字
MOV CX, 16 ;显示16位数
DDDD:
MOV DL, '0' ;先计划显示0
TEST AX, 8000H ;测试最高位
JZ DDD1
INC DL ;非0就显示1
DDD1:
PUSH AX
MOV AH, 2 ;显示DL中的ASCII码
INT 21H
POP AX
SHL AX, 1 ;左移
LOOP DDDD ;CX-1,非零转移
JMP END0 ;16位显示完毕,转到结束
;---------------------------------------
ERROR:
LEA DX, ERR
MOV AH, 09H ;错误信息提示
INT 21H
;---------------------------------------
END0:
MOV DL, 10
MOV AH, 2 ;显示DL中的ASCII码
INT 21H
MOV DL, 13
MOV AH, 2 ;显示DL中的ASCII码
INT 21H
;---------------------------------------
MOV AX, BIN ;取来数字
CALL DISP_AX
MOV AH, 4CH ;返回DOS
INT 21H
;------------------------------
DISP_AX:
MOV BX, 10 ;10进制.
MOV CX, 5 ;5位.
ABC:
MOV DX, 0
DIV BX
PUSH DX ;保存余数
LOOP ABC
MOV CX, 5 ;显示5位.
ASD:
POP DX
CMP DL, 10
JB A48
ADD DL, 7
A48:
ADD DL, 48
MOV AH, 2
INT 21H ;输出.
LOOP ASD
RET
;------------------------------
CODE ENDS
;---------------------------------------
END START
;=============================================
解释下混合编程:
就是使用C语言 C++ 汇编的语言编写同一程序。这样的好处
1 c语言实现严谨,
2 c++实现方便
3 汇编编译的速度快
因为C++兼容C,所以这没什么说的。使用汇编就是
在程序中实现下面的关键字
__asm
{
..../*这里实现汇编*/
}
汇编时间长不用了 帮不了你实现了 楼下接着搞
code segment
assume cs:code
org 100h
start:
push cs
pop ds
push cs
pop es
call inputnum
mov cx,num
mov ax,0
lea si,array
@1:
add ax,[si]
inc si
inc si
loop @1
mov bx,num
div BL
xor ah,ah
call dispnum
mov ah,4ch
int 21h
; 键盘输入数值数组子程序(数组名为array,元素个数存放在num中)
inputnum proc near
; 输入的数据以一个空格分隔,以回车符结束输入
lea di,array ;将数组第一个元素的有效地址置入DI
mov word ptr[num],0
stin:
mov ax,0
push ax
again1:
mov ah,1
int 21h
mov byte ptr[char],al
cmp al,13
je line0
cmp al,' '
je line0
sub al,30h
mov ah,0
mov si,ax
pop ax
mov cl,10
mov ch,0
mul cx
add ax,si
push ax
jmp again1
line0:
pop ax
mov word ptr[di],ax
inc word ptr[num]
cmp byte ptr[char],13
je stinend
inc di
inc di
jmp stin
stinend:
ret
array dw 100 dup(0)
num dw 0
char db ?
inputnum endp
; 显示十进制整型数值子程序
dispnum proc near
; 将要显示的数据放入AX中
mov dx,0
mov bx,10
div bx
mov byte ptr[y+6],dl ;保存个位
mov dx,0
div bx
mov byte ptr[y+5],dl ;保存十位
mov dx,0
div bx
mov byte ptr[y+4],dl ;保存百位
mov dx,0
div bx
mov byte ptr[y+3],dl ;保存千位
mov byte ptr[y+2],al ;保存万位
mov al,byte ptr[y+2]
add al,30h ;万位转ASC2
mov byte ptr[y+2],al
mov al,byte ptr[y+3]
add al,30h ;千位转ASC2
mov byte ptr[y+3],al
mov al,byte ptr[y+4]
add al,30h ;百位转ASC2
mov byte ptr[y+4],al
mov al,byte ptr[y+5]
add al,30h ;十位转ASC2
mov byte ptr[y+5],al
mov al,byte ptr[y+6]
add al,30h ;个位转ASC2
mov byte ptr[y+6],al
mov di,1
disp1:
inc di
cmp di,6
je dispexit
cmp byte ptr[y+di],'0'
jne dispexit
mov byte ptr[y+di],' '
jmp disp1
dispexit:
mov ah,9
lea dx,y
int 21h
ret
y db 10,13,0,0,0,0,0,'$'
dispnum endp
code ends
end start
请在未来汇编环境中调试运行。
这个我会,可以帮你写!
C\/C++与汇编混合编程有什么好处
当需要C\/C++与汇编混合编程时,可以有以下两种处理策略:若汇编代码较短,则可在C\/C++源文件中直接内嵌汇编语言实现混合编程。若汇编代码较长,可以单独写成汇编文件,最后以汇编文件的形式加入项目中,通过ATPCS规定与C程序相互调用及访问。后缀.S文件中的汇编指令是用armasm汇编器进行汇编的,而C语言程...
汇编语言和C语言的混合编程,如何用keilC51把.c和.asm文件编译成一HEX文 ...
以个例子给你参考,有两个文件,一是S.a51, 另一个是 M.C都加到KEILL的工程中编译。汇编中有两个函数,注意C的参数是如何传递给汇编的。S.A51 NOMOD51 NAME SENTBYTEUP ?PR?_SentByteUp?SENTBYTEUP SEGMENT CODE ?DT?_SentByteUp?SENTBYTEUP SEGMENT DATA OVERLAYABLE PUBLIC _SentByteUp ...
试用混合编程的方法求x的值。指标要求(1)x=(1+2!+3!+4!+5!)\/5(2...
(1) 混合编程的方法一般指将C\/C++语言与汇编语言结合使用,以充分利用汇编语言的性能优势来提高程序效率。但是对于这道题目来说,完全可以使用C语言来实现。下面是一种实现方式:(2) 主程的编写相对简单,只需要在main函数中添加上述代码即可。需要注意的是,计算阶乘时需要定义一个变量fact,初始化为1,...
如何在64位的linux系统上使用汇编和C语言混合编程
C51与汇编语言混合编程(1).C51语言中调用汇编语言程序1、在文件中选中FILEGROUP和C51程序原文件,在配置文件选项中激活“i”产生汇编(SRC)文件,“编译(SRC)文件”和“创建工程(目标)时包含“三个选项。2、根据选择的编译模式,把相应的库文件(如SMALL模式,库文件为KEIL\\C51\\LIB\\C51S.LIB)加入...
编操作系统最好用什么语言
C和汇编混合编程,要编制一个独立完整的操作系统必须用到机器语言或汇编语言,主流的3种操作系统Windows,Linux,Unix,内核都是用C语言和汇编写的,上层高级特性,比如notepad.exe这样的,和一些不涉及底层的系统程序、模块是用C++写的。看来到这里来的programer不多啊。
不学汇编可以学底层吗
越来越多的低层开发人员开始使用高级语言,例如C、C++、C51。相较于汇编语言,这些高级语言实现循环和分支等结构的程序更加简单易懂。尽管汇编语言在编写输入输出接口程序方面具有优势,但其他场合则更适合使用C语言,即进行混合编程。我意识到学习汇编语言的重要性在于理解微机底层的工作机制,这同样适用于...
C语言和汇编混合编程时如何带回一个以上的返回参数
本来C语言就只能返回一个值,不管你和什么语言混合。可以用指针参数返回值,也可以定义一个结构,包装好要返回的多个值,然后返回其指针,注意不要返回栈内存的地址就可以了
简述C程序的主要结构特点。
【答案】:C程序以函数为单位,由一个主函数和若干个其他函数构成,主函数是程序的入口,其他函数由主函数直接或间接调用。程序可以由一个文件或多个文件组成。文件类型包括头文件和C语言源文件,也可以是汇编语言文件,C程序可与汇编语言混合编程。
最近在搞C\\C++ 和汇编语言 的混合编程,如何讲2者在编译环境中连接起来...
编译和连接多模块程序。本章仅覆盖了C、C++、Basic和FORTRAN的汇编语言接口,没有覆盖高级语言间的混合编程。此处的重点是微软版本的C、C++、Basic和FORTRAN,但相同的原则适用于其他语言和编译器。本章使用的许多技巧使用了第7章里的关于使用汇编语言编写过程,以及第8章的多模块编程的资料进行解释。
机器人语言的编程语言
编程时可以VAL语言和6503汇编语言混合编程。VAL语言命令简单、清晰易懂,描述机器人作业动作及与上位机的通信均较方便,实时功能强;可以在在线和离线两种状态下编程,适用于多种计算机控制的机器人;能够迅速地计算出不同坐标系下复杂运动的连续轨迹,能连续生成机器人的控制信号,可以与操作者交互地在线修改程序和生成程序;...