汇编语言编程

kuaidi.ping-jia.net  作者:佚名   更新日期:2024-07-17
汇编语言是一种什么程序设计语言?

汇编语言是一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。在汇编语言中,用助记符代替机器指令的操作码,用地址符号或标号代替指令或操作数的地址。
比起机器语言,汇编语言具有更高的机器相关性,更加便于记忆和书写,但又同时保留了机器语言高速度和高效率的特点。
汇编语言仍是面向机器的语言,很难从其代码上理解程序设计意图,设计出来的程序不易被移植,故不像其他大多数的高级计算机语言一样被广泛应用。所以在高级语言高度发展的今天,它通常被用在底层,通常是程序优化或硬件操作的场合。



扩展资料:
在许多程序的设计当中,高级语言和汇编语言可以相互交叉调用,进行参数传递,共享数据信息,这便是所谓的混合编程。
程序员往往在高级语言程序中直接嵌入汇编语句,以实现对硬件直接进行控制的功能,这是混合编程中常见的做法。也可以在高级语言程序中使用汇编语言中定义的变量和常量,或使用内部函数对汇编语句进行调用。
简而言之,这类混合编程的方法可以让高级语言与汇编语言互相取长补短,各自发挥各自优势,同时减少各自缺点所带来的不便,善用这个方法可以使开发和编程工作达到事半功倍的效果。

; 编写多字节有符号数的加法程序,从键盘接收两个加数,在屏幕上显示结果。
; 16位有符号数加减运算
assumecs:codesg,ds:datasg,ss:stacksg
datasg segment
input1db'Input first number! ','$'
input2db'Input second number! ','$'
resultdb'Sum is : ','$'
; 21号中断10号例程,存放输入数据
add1db6; 缓冲区最大容量
db?; 实际上接收字符的个数,不包括最后的回车
db6 dup (?); 存放输入的字符,回车结尾
add2db6
db?
db6 dup (?)
numdw?; 存放中间结果
signdb?; 两个数和的符号位
sumdw10 dup (?); 两个数的和
datasg ends
stacksg segment

stacksg ends
codesg segment
start:movax,datasg
movds,ax

leadx,input1
movah,9
int21h

; 读取第一个加数
movdx,offset add1
movah,10
int21h
; 取光标位置,ah为行,al为列
movah,3
movbh,0
int10h

; 设置光标位置
movah,2
movbh,0
incdh
movdl,0
int10h

leadx,input2
movah,9
int21h
; 读取第二个加数
movdx,offset add2
movah,10
int21h
; 取光标位置,ah为行,al为列
movah,3
movbh,0
int10h

; 设置光标位置
movah,2
movbh,0
incdh
movdl,0
int10h

leadx,result
movah,9
int21h
; 转换第一个数字,并设置字符串个数
movbx,offset add1
movcl,[bx+2]
pushcx; 保存符号位
xordx,dx
; 确定第一位是数字不是符号位
cmpcl,30h
jbpos1
cmpcl,39h
japos1
movdl,[bx+1]; 然后确定数字长度
addbx,2
movax,bx; 确定字符串首地址
jmpconvert1
pos1:
movdl,[bx+1]
decdl; 确定数字长度
addbx,3
movax,bx; 确定字符串首地址
convert1:
pushdx
pushax
callDeciToBina
popcx; 取出符号位
cmpcl,2dh
jnzsign1; 不为负号则不变
negax
sign1:
leabx,num
mov[bx],ax; 保存第一个数
; 转换第二个数字
movbx,offset add2
xordx,dx
movcl,[bx+2]; 测试符号位
pushcx
cmpcl,30h
jbposi2
cmpcl,39h
japosi2
movdl,[bx+1]; 保存数字字符串长度
addbx,2
movax,bx; 保存数字字符串首地址
jmpconvert2
posi2:
movdl,[bx+1]
decdl; 保存数字字符串的长度
addbx,3
movax,bx; 保存数字字符串首地址
convert2:
pushdx
pushax
callDeciToBina
popcx
cmpcl,2dh
jnzsign2
negax
sign2:
leabx,num
addax,[bx]
; 设置结果的符号
pushax
andax,1000000000000000b
negax
sbbax,ax
negax
leabx,sign
cmpax,1
jnzsign3
movbyte ptr [bx],'-'
popax
negax; 如为负数,则求出结果的绝对值
jmpoutput
sign3:
movbyte ptr [bx],'+'
popax
; 转为ascii码输出
output:
pushax
leabx,sum
pushbx
callBinaToDeci

leadx,sign
movah,9
int21h
; 取光标位置,ah为行,al为列
movah,3
movbh,0
int10h

; 设置光标位置
movah,2
movbh,0
incdh
movdl,0
int10h
movax,4c00h
int21h
; ***********************************************************************
; 作用:将十六进制数,转为十进制字符,用以输出
; 形式:void BinaToDeci( [buff], int ),从右向左依次压入堆栈
; 参数1:第一个参数 [buff]:接收结果的缓冲区地址
; 参数2:第二个参数int :待转换的十六进制数字
; 返回值:无,直接保存到内存中
; ***********************************************************************
BinaToDeciproc
pushbp
movbp,sp
pushax
pushbx
pushcx
pushdx
movcx,0; 初始化计数器,记录循环次数,即十进制数的位数
movax,[bp+6]; 取出传入的待转换十六进制数,段内调用只加6,段间调用加8
; 计算出十进制各位数字,并保存到堆栈
bina_next:
xordx,dx
movbx,10
divbx
pushdx
inccx
cmpax,0
jzbina_end
jmpbina_next

bina_end:
movbx,[bp+4]; 取出保存十进制数的缓冲区首地址
; 将十进制的各个位数转换成ascii码,并存入指定的内存区域
bina_next2:
popax
addax,30h
movbyte ptr [bx],al
incbx
loopbina_next2

; 字符串以'$'结尾,用以调用21号中段的9号例程
movbyte ptr [bx],'$'
popdx
popcx
popbx
popax
movsp,bp
popbp
ret4
BinaToDeciendp
; ***********************************************************************
; ***********************************************************************
; 作用:将十进制字符,转换为十六进制数,用以计算
; 形式:void DeciToBina( [buff], int ),从右向左依次压入堆栈
; 参数1:第一个参数 [buff]:放置十进制数字字符串的缓冲区的首地址
; 参数2:第二个参数int :十进制字符串的字符个数
; 返回值:十六进制的数字
; ***********************************************************************
DeciToBinaproc
pushbp
movbp,sp
pushbx
pushcx
pushdx
pushsi
movbx,[bp+4]; 取放置十进制字符串缓冲区的首地址
movcx,[bp+6]; 十进制数字字符串的字符个数
xorax,ax

; 将ascii码还原为数字,并保存到堆栈
deci_next:
moval,byte ptr [bx]; 依次取缓冲区内的字符
subal,30h
pushax
incbx
loopdeci_next
movcx,[bp+6]; 再次获得字符的个数
xorax,ax
xordx,dx
movbx,1; 用作乘数
xorsi,si
; 各位相乘然后累加获得十六进制数值
; 结果=个位*1+十位*10+百位*100+千位*1000
deci_next1:
popax; 取出数字
mulbx; 相乘
addsi,ax; 累加结果

; 计算下次相乘时的乘数
movax,bx
movbx,10
mulbx
movbx,ax
loopdeci_next1

; 将结果存入ax,为返回值
movax,si
popsi
popdx
popcx
popbx
movsp,bp
popbp
ret4
DeciToBinaendp
; ***********************************************************************
codesg ends
end start

DATA SEGMENT
STR1 DB 0AH,0DH,'3-7 age: ','$'
STR2 DB 0AH,0DH,'7-18 age: ','$'
STR3 DB 0AH,0DH,'3-18 age: ','$'
SUM DW ?,?
DATA ENDS
STACK SEGMENT STACK
DB 200 DUP(?)
STACK ENDS
CODE SEGMENT
ASSUME DS:DATA,CS:CODE,SS:STACK
START: MOV AX,DATA
MOV DS,AX

MOV DX,OFFSET STR1
MOV AH,9
INT 21H

AND DX,0
MOV AX,(7-3)*12
MOV BX,300
MUL BX ;3-7月一共多少钱
MOV SUM,AX
MOV SUM+2,DX
CALL DISPLAY ;显示3-7总共花的钱

MOV DX,OFFSET STR2
MOV AH,9
INT 21H

AND DX,0
MOV AX,(18-7)*12
MOV BX,500
MUL BX ; 7-18总共花费多少钱

ADD SUM,AX
ADC SUM+2,DX
CALL DISPLAY ;显示7-18岁共花费的钱

MOV DX,OFFSET STR3
MOV AH,9
INT 21H
MOV AX,SUM
MOV DX,SUM+2
CALL DISPLAY ;显求3-18岁共花费的钱
MOV AH,4CH
INT 21H
;子程序名:DISPLAY
;子程序功能:十进制显示
;入口参数:DX,AX
;出口参数:
;使用寄存器:DI,BX,CX,DX
DISPLAY PROC
MOV DI,OFFSET STR1 ;将DI指向BUF的下一单元
MOV BX,10 ;准备除以10
MOV CX,0 ;准备统计余数的个数
CHANGE10:DEC DI ;准备存放余数,往前倒存
INC CX
DIV BX ;DX,AX除以BX (BX=10)
ADD DL,30H ;余数变为ASCII码值
MOV BYTE PTR[DI],DL ;存储十进制数
MOV DX,0
CMP AX,0 ;是否为0?
JNZ CHANGE10 ;不为0转CHANGE10
CHANGE11:MOV DL,BYTE PTR[DI] ;取出存放在BUF中的十进制数到DL供显示
MOV AH,2 ;显示1个字符
INT 21H
INC DI
LOOP CHANGE11
MOV DL,0AH
INT 21H
MOV DL,0DH
INT 21H
RET
DISPLAY ENDP
CODE ENDS
END START
改好了。

这到让我想起我的大学生活了,曾经也学过汇编课程,曾经也有一些急的直跳的难题,现在把汇编的知识又还给老教授了。一位同学做出来,就又一群同学做出来,祝你好运吧!

.section .data
cost1: .int 300
cost2: .int 500
time1: .int 48
time2: .int 132
ret1: .int 0
ret2: .int 0

.section .text
.globl _start
_start:
movw cost1, %eax
movw time1, %edx
imul %edx, %eax
movw %eax, ret1

movw cost2, %eax
movw time2, %edx
imul %edx, %eax
add cost1 %eax
movw %eax, ret2
======================================================
我也不怎么会汇编,只是感兴趣,随便写写。一个简单的方法,用C语言写,然后只编译,不汇编,然后查看汇编的代码。gcc 好像是 -S选项。

;每个孩子都有自己的零花钱,孩子3岁是每月消费300元,等到孩子7岁时,共消费多少钱?如果7岁后,
;每月消费500元,问孩子从7岁至18岁,共消费多少钱?3岁至18岁共消费多少钱?

;用MASM5.0编译通过,以下是运行实例
;E:\masm>1123_1

;SUM(3-7) : 14400
;SUM(7-18) : 66000
;TOTAL(3-18) : 80400
;E:\masm>

data segment

Y3_7 DW 300
Y7_18 DW 500
DB 'HHHHHHHHHHHHH'
SUM3_7 DW 0,0
SUM7_18 DW 0,0
SUM3_18 DW 0,0
DB 'HHHHHHHHHHHHH'
CRLF DB 0dh,0ah,'$'
s1 db 0dh,0ah,'SUM(3-7) : $'
s2 db 0dh,0ah,'SUM(7-18) : $'
s3 db 0dh,0ah,'TOTAL(3-18) : $'

DB 'HHHHHHHHHH'

data ends
code segment
assume cs:code, ds:data
main proc far
start:
push ds
xor ax,ax
push ax
mov ax,data
mov ds,ax
;-------------------------
START_1:
MOV AX,Y7_18
MOV CX,(18-7)*12
MUL CX
MOV BX,OFFSET SUM7_18
MOV [BX],AX
MOV [BX+2],DX
PUSH DX
PUSH AX

MOV AX,Y3_7
MOV CX,(7-3)*12
MUL CX
MOV BX,OFFSET SUM3_7
MOV [BX],AX
MOV [BX+2],DX

POP CX
ADD AX,CX
POP CX
ADC DX,CX
MOV BX,OFFSET SUM3_18
MOV [BX],AX
MOV [BX+2],DX

MOV AH,09
MOV DX,OFFSET S1
INT 21H
MOV BX,OFFSET SUM3_7
MOV AX,[BX]
MOV DX,[BX+2]
CALL HTOD

MOV AH,09
MOV DX,OFFSET S2
INT 21H
MOV BX,OFFSET SUM7_18
MOV AX,[BX]
MOV DX,[BX+2]
CALL HTOD

MOV AH,09
MOV DX,OFFSET S3
INT 21H
MOV BX,OFFSET SUM3_18
MOV AX,[BX]
MOV DX,[BX+2]
CALL HTOD

ret
main endp
;==================
HTOD PROC NEAR
;入口DX:AX 32位数,值<99999
MOV CX,10000
DIV CX
PUSH DX ;保存余数
ADD AL,30H
MOV DL,AL
MOV AH,02
INT 21H

POP AX ;取余数
MOV DX,0
MOV CX,1000
DIV CX
PUSH DX ;保存余数
ADD AL,30H
MOV DL,AL
MOV AH,02
INT 21H

POP AX ;取余数
MOV DX,0
MOV CX,100
DIV CX
PUSH DX ;保存余数
ADD AL,30H
MOV DL,AL
MOV AH,02
INT 21H

POP AX ;取余数
MOV DX,0
MOV CX,10
DIV CX
PUSH DX ;保存余数
ADD AL,30H
MOV DL,AL
MOV AH,02
INT 21H

POP DX ;取余数
ADD DL,30H
MOV AH,2
INT 21H

RET

HTOD ENDP
;==================

code ends
end start

  • 汇编语言是什么?
    答:汇编语言(Assembly Language)是面向机器的程序设计语言。在汇编语合中,用助记符(Memoni)代替操作码,用地址符号(Symbol)或标号(Label)代替地址妈。这样用符号代替机器语盲的二进制码,就把机器语音变成了汇编语言。于是汇编语言亦称为符号语言。使用汇编语言编写的程序,机器个能直接识别,要由一种程序将...
  • 汇编语言是一种什么语言?
    答:汇编语言”作为一门语言,对应于高级语言的编译器,需要一个“汇编器”来把汇编语言原文件汇编成机器可执行的代码。汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。在汇编语言中,用助记符代替机器指令的操作码,用地址符号或标号...
  • 汇编语言程序设计步骤 有那几步
    答:汇编语言程序设计步骤: 1、 分析问题,抽象出描述问题的数据模型 2、 确定问题的算法思想 3、 画出流程图或结构图 4、 分配存储器和工作单元(寄存器) 5、 逐条编写程序 6、 静态检查,上机调试 例:编程查找考生的最高分,假设所有考生分数已存入计算机内存。 1、 分析问题 根据条件、特点、规律 ...
  • 如何用汇编语言编程?
    答:最简单的办法是运行debug程序,可以用它写一些x86处理器的小程序。用e命令输入数据,用a命令输入指令序列,用d命令显示内存数据,用u命令反汇编,用n命令给文件命名,用r命令修改寄存器的值,用L命令装载文件,用w命令写入文件,用g命令执行程序 ......
  • 什么是汇编语言? 计算机编程语言有哪些?
    答:汇编语言(Assembly Language)是面向机器的程序设计语言.汇编语言是一种功能很强的程序设计语言,也是利用计算机所有硬件特性并能直接控制硬件的语言。汇编语言”作为一门语言,对应于高级语言的编译器,需要一个“汇编器”来把汇编语言原文件汇编成机器可执行的代码。高级的汇编器如MASM, TASM等等为我们写汇编...
  • 程序语言分为哪三类
    答:在不同的设备中,汇编语言对应着不同的机器语言指令集,通过汇编过程转换成机器指令。普遍地说,特定的汇编语言和特定的机器语言指令集是一一对应的,不同平台之间不可直接移植。多汇编程序为程序开发、汇编控制、辅助调试提供了额外的支持机制。有的汇编语言编程工具经常会提供宏,它们也被称为宏汇编器。
  • 汇编语言程序设计的一般步骤是什么?
    答:这是编制汇编语言程序最为重要的一步。算法里规定的功能,是要通过一条条指令描述出来的。为了提高编程能力,对于初学者,一是要多阅读现有的程序,以学习别人的编程经验;而更为重要的是,必须多亲自动手编写,不要怕失败,只有通过无数次失败,才能从中积累自己的编程经验。(5) 上机调试运行程序。通过...
  • 什么是汇编语言?
    答:具有实时性.由于汇编的特点,汇编语言常用于编写计算机系统程序、实时通信程序和实时控制程序。但汇编语言程序依赖于机器硬件,其通用性和移植性都较差。相对于汇编语言,高级语言的编程方便快捷,通用性和移植性都较好,在一些涉及大量数据处理、人机界面等设计任务的应用程序中,采用高级语言编程更为合适。
  • 汇编语言是一种什么语言?
    答:汇编语言是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。在汇编语言中,用助记符代替机器指令的操作码,用地址符号或标号代替指令或操作数的地址。在不同的设备中,汇编语言对应着不同的机器语言指令集,通过汇编过程转换成机器指令。特定的汇编语言和特定的...
  • 什么是汇编程序?什么是汇编语言
    答:但也有优点,用机器语言编写出来的程序执行效率高,CPU严格按照程序员的要求去做,没有多余的额外操作。所以,在以保留“程序执行效率高”为前提下,人们就开始着手研究一种能大大改善程序可读性的编程方法。为了改善机器指令的可读性,选用了一些能反映机器指令功能的单词或词组来代表该机器指令,而不再...