‘壹’ 用汇编语言设计程序实现10!(10的阶乘)
mov r0,#10
mov r8,r0
mov r9,#0
sub r0,r8,#1
loop:
mov r1,r9
UMULL r8,r9,r0,r8
MLA r9,r1,r0,r9
SUBS r0,r0,#1
BNE loop
‘贰’ 关于汇编程序设计
第8题:
①先在屏幕显示一行字符,长度和显示位置自己定
②让行首的一个字符移动到行尾进行显示(这是从屏幕左边到右边),设置好延时,重复上面的动作,在移动程序内部设置好停止移动的条件。或者你可以整体将字符串向前移动一格,同样设置好延时,重复操作
‘叁’ 汇编语言程序设计题
我写的有点长,经验证,运行无误。
代码贴在:任意两个10位以内十六进制数求和
http://tieba..com/f?kz=681706003
如是能用的,请顶一下。
为了方便修改,新代码直接贴在我的网络空间。
新代码添加了无输入处理和清除前导空格指令。
经验证,无楼主提到的‘1111111111+1111111111=42222222222’
的BUG,显示运算结果准确。
附言:21H的10号(0AH)功能,无法滤除:G~Z,所以不能用;
汤旺河边 错在: rcl al,1 ;把进位标志移入AL.
‘肆’ 汇编语言是一种什么程序设计语言
汇编语言是一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。在汇编语言中,用助记符代替机器指令的操作码,用地址符号或标号代替指令或操作数的地址。
比起机器语言,汇编语言具有更高的机器相关性,更加便于记忆和书写,但又同时保留了机器语言高速度和高效率的特点。
汇编语言仍是面向机器的语言,很难从其代码上理解程序设计意图,设计出来的程序不易被移植,故不像其他大多数的高级计算机语言一样被广泛应用。所以在高级语言高度发展的今天,它通常被用在底层,通常是程序优化或硬件操作的场合。
(4)汇编程序设计扩展阅读:
在许多程序的设计当中,高级语言和汇编语言可以相互交叉调用,进行参数传递,共享数据信息,这便是所谓的混合编程。
程序员往往在高级语言程序中直接嵌入汇编语句,以实现对硬件直接进行控制的功能,这是混合编程中常见的做法。也可以在高级语言程序中使用汇编语言中定义的变量和常量,或使用内部函数对汇编语句进行调用。
简而言之,这类混合编程的方法可以让高级语言与汇编语言互相取长补短,各自发挥各自优势,同时减少各自缺点所带来的不便,善用这个方法可以使开发和编程工作达到事半功倍的效果。
‘伍’ 汇编语言程序设计中使用哪种软件工具
1、MASM。
微软公司为x86微处理器家族开发的汇编开发环境,拥有可视化的开发界面,使开发人员不必再使用DOS环境进行汇编的开发,编译速度快,支持80x86汇编以及Win32Asm,是Windows下开发汇编的利器。
2、NASM。
全称The Netwide Assembler,是一款基于80x86和x86-64平台的汇编语言编译程序,其设计初衷是为了实现编译器程序跨平台和模块化的特性。
3、TASM。
Borland公司开发的汇编编译器,被广泛用于Turbo C,Quick Basic等编译器,用作中间过渡编译。它也能独立的编译纯汇编或是Win32Asm的代码。具有编译快速,高效的特点,至今依然是汇编开发的首选利器。
4、GAS。
GNU汇编器(GNU Assembler),简称为GAS,是由GNU计划所使用的汇编器,GNU的核心精神是自由与分享,所以GAS亦是自由软件。
5、RadASM。
一款着名的WIN32汇编编辑器,支持MASM、TASM等多种汇编编译器,Windows界面,支持语法高亮,自带一个资源编辑器和一个调试器。拥有较强的工程管理功能,加之众多插件的支持,使得它用汇编语言编写Windows软件变得得心应手。
‘陆’ 汇编程序设计
;
IN AL, 40H
CMP AL, 1
JNE _2
;------------------------------
LEA SI, BUF1
MOV AX, 0
MOV BX, 0
MOV CX, 100
LP1:
MOV AL, [SI]
ADD BX, AX
INC SI
LOOP LP1
MOV SUM1, BX
;------------------------------
LEA SI, BUF2
MOV AX, 0
MOV BX, 0
MOV CX, 100
LP2:
MOV AL, [SI]
ADD BX, AX
INC SI
LOOP LP2
MOV SUM2, BX
JMP _END
;------------------------------
_2:
CMP AL, 2
JNE _END
MOV SI, 0
MOV CX, 100
LP3:
MOV AL, BUF1[SI]
ADD AL, BUF2[SI]
MOV THIRD[SI], AL
INC SI
LOOP LP3
JMP _END
_END:
HLT
END
‘柒’ 汇编语言程序设计
一.
1.ADD BX,AX 或 ADD BL,AL ;类型配对
2.MOV AX,0A999H
3.MOV AX,0F8H
4.MOV AX,1234H 或 MOV AL,12H
5.MOV AX,[BX]
6.MOV DS,AX ;DS不能直接存立即数
7.ADD [BX],10 ;对
8.PUSH AX ;push不能直接push立即数
9.IN AL,DX
10.OUT 40H ,AL
11.MUL AL ;mul不能直接跟立即数
12.MOV [DI],AX ;mov不能两个都是内存
13.ADD DI,AX
14.MOV DS,AX ;CS不可以改
15.SUB 10[SI],AX ;si di 不可以同时出现
二.
SUB [BP], BX 寄存器间接寻址方式;30400H;
MOV [BX+DI], SI 基址变址寻址方式;10400H;
ADD ES:[SI], DI 寄存器相对寻址方式;20200H;
MOV 10[BX], DI 寄存器相对寻址方式;10100H;
MOV DS:[100H], BX 相对基址变址寻址方式;10100H
三.
3456H;5678H;1234H;5678H;
四.
1234H;2468H;0008H;1008H;0804H;0408H;0508H;0508H
五.
01H,31H,0FFH,00H,78H,56H,FFH,FFH,00H,24H,00H,0BH,00H,0BH,19H,09H,09H
(从左往右地址变大)
AX=3101H,BX=0023H
六.
1.
汇编语言:(AssemblyLanguage)是面向机器的程序设计语言。
汇编:把汇编语言翻译成机器语言的过程称为汇编。
汇编程序:把汇编语言书写的程序翻译成与之等价的机器语言程序的翻译程序。汇编程序输入的是用汇编语言书写的源程序,输出的是用机器语言表示的目标程序。汇编语言是为特定计算机或计算机系列设计的一种面向机器的语言,由汇编执行指令和汇编伪指令组成。采用汇编语言编写程序虽不如高级程序设计语言简便、直观,但是汇编出的目标程序占用内存较少、运行效率较高,且能直接引用计算机的各种设备资源。它通常用于编写系统的核心部分程序,或编写需要耗费大量运行时间和实时性要求较高的程序段。
2.
3.
单独cmpsb就是逐一比较8个位;加上rep,循环比较,还是比较这8位啊
4.
是指在计算机执行期间,系统内发生任何非寻常的或非预期的急需处理事件,使得CPU暂时中断当前正在执行的程序而转去执行相应的时间处理程序。待处理完毕后又返回原来被中断处继续执行或调度新的进程执行的过程。
5.
宏和子程序都是为了简化源程序的编写,提高程序的可维护性,但是它们二者之间存在着以下本质的区别:
1、在源程序中,通过书写宏名来引用宏,而子程序是通过CALL指令来调用;
2、汇编程序对宏通过宏扩展来加入其定义体,宏引用多少次,就相应扩展多少次,所以,引用宏不会缩短目标程序;而子程序代码在目标程序中只出现一次,调用子程序是执行同一程序段,因此,目标程序也得到相应的简化;
3、宏引用时,参数是通过“实参”替换“形参”的方式来实现传递的,参数形式灵活多样,而子程序调用时,参数是通过寄存器、堆栈或约定存储单元进行传递的;
4、宏引用语句扩展后,目标程序中就不再有宏引用语句,运行时,不会有额外的时间开销,而子程序的调用在目标程序中仍存在,子程序的调用和返回均需要时间。
总之,当程序片段不长,速度是关键因素时,可采用宏来简化源程序,但当程序片段较长,存储空间是关键因素时,可采用子程序的方法来简化源程序和目标程序。
七.
…………
‘捌’ 汇编程序设计
下面是我的一篇文件操作代码,你修一下就可以用了。
include kcsj.mac
.model small
.386
.stack 200h
public prog1
.data
menu db 30 p(' '),'1.Display text file',0ah,0dh
db 30 p(' '),'2.Copy text file',0ah,0dh
db 30 p(' '),'3.Delete text file',0ah,0dh
db 30 p(' '),'4.The end',0ah,0dh
db 30 p(' '),'Please select one(1~4):','$'
prompt1 db 0ah,0dh,'File name:$'
prompt2 db 0ah,0dh,'Lines of page(1~25):$'
FNAME db 15,?,15 p(' ') ;存放文件名的缓冲区
out1 db 0ah,0dh,'Can not open file!$'
out2 db 0ah,0dh,'Can not read file!$'
out3 db 0ah,0dh,'Can not creat file!$'
out4 db 0ah,0dh,'Can not write file!$'
out5 db 0ah,0dh,'Can not delete file!$'
out6 db 0ah,0dh,'The file has been ed!$'
out7 db 0ah,0dh,'The file has been deleted!$'
buffer db ?
endcode db 0 ;错误标志
end1 db 0 ;结束标志
code1 dw ? ;原文件的代号
code2 dw ? ;新建文件的代号
sign db 0
ask1 db 0ah,0dh,'Input source file name:$'
ask2 db 0ah,0dh,'Input dest file name:$'
row db 23
info db 'Press ESC to quit,p to change page,anykey to continue!$'
.code
prog1 proc far
init
call mainshow
L1:mov ah,1
int 21h
cmp al,'1'
je display
cmp al,'2'
je
cmp al,'3'
je delete
jmp rtn1
display:call fdisp
call mainshow
mov end1,0
mov [row],23
mov endcode,0
jmp L1
:call f
call mainshow
mov endcode,0
mov sign,0
jmp L1
delete:call fdel
call mainshow
jmp L1
rtn1:ret
prog1 endp
mainshow proc near
scroll 0
cursor 10,0
strdisp menu
ret
mainshow endp
fdisp proc near ;分页显示
strdisp prompt1
call fopen
scroll 0 ;清屏
cursor 0,0 ;置光标
cmp endcode,1
jne cont
mov ah,7
int 21h
jmp ext0
cont:mov bx,code1
call fread
cmp endcode,1
je ext1
call fshow ;显示
cmp end1,1
je ext1
jmp cont
ext1:mov ah,3eh ;关闭文件
mov bx,code1
int 21h
ext0:mov endcode,0
ret
fdisp endp
fopen proc near ;打开文件
call in_name
mov ah,3dh
mov al,0
int 21h
jnc next
mov endcode,1
strdisp out1
ret
next:mov bx,ax
mov code1,ax
ret
fopen endp
in_name proc near ;输入文件名
lea dx,FNAME
mov ah,0ah
int 21h
lea bx,FNAME+2
mov ah,0
mov al,FNAME+1
add bx,ax
mov byte ptr [bx],0
add dx,2
ret
in_name endp
fread proc near ;读取文件
mov ah,3fh
mov cx,1
lea dx,buffer
int 21h
jnc past
strdisp out2
jmp exit
past:cmp ax,0
je exit
ret
exit:mov ah,3eh
int 21h
mov endcode,1
ret
fread endp
fshow proc near ;显示文件
mov dl,[buffer]
mov ah,2
int 21h
mov ah,3
mov bh,0
int 10h
cmp dh,[row]
jae d1
ret
d1:strdisp info
d2:mov ah,7
int 21h
cmp al,0
jz d2
cmp al,1bh ;按ESC退出
jz d4 ;退出关闭文件endcode=1
cmp al,70h ;按P提示输入每页行数
jnz d3
strdisp prompt2
call chtonum
mov [row],al
d3:scroll 0
cursor 0,0
ret
d4:mov end1,1
ret
fshow endp
chtonum proc near
mov bx,0
newchar:mov ah,1 ;输入数字并转换为十进制
int 21h
sub al,30h
jl goon
cmp al,9
jg goon
cbw
xchg ax,bx
mov cx,10d
mul cx
xchg ax,bx
add bx,ax
jmp newchar
goon:mov al,bl ;行数传给AL
ret
chtonum endp
f proc near ;文件拷贝
scroll 0
cursor 0,0
strdisp ask2
call fcreat
cmp endcode,1
je over
mov code2,ax
strdisp ask1
call fopen
cmp endcode,1
je etn0
again:call fread
cmp endcode,1
je etn0
mov sign,1
push bx
cmp ax,0
je next2
mov cx,ax
mov bx,code2
mov ah,40h
int 21h
pop bx
jnc again
strdisp out4
ret
next2:mov ah,3eh
mov bx,code1
int 21h
etn0:mov ah,3eh
mov bx,code2
int 21h
cmp sign,1
jne over
strdisp out6
over:mov ah,7
int 21h
ret
f endp
fcreat proc near ;创建文件
call in_name
mov ah,3ch
mov cx,00
int 21h
jnc next1
mov endcode,1
strdisp out3
next1:ret
fcreat endp
fdel proc near ;删除文件
scroll 0
cursor 0,0
strdisp prompt1
call in_name
mov ah,41h
int 21h
cmp ax,0
jnz quit
strdisp out5
mov ah,7
int 21h
ret
quit:strdisp out7
mov ah,7
int 21h
ret
fdel endp
end prog1
‘玖’ 汇编语言程序设计
; 本程序通过编译,运行正确
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
; -----------------------------------------
; 功能:输出回车换行
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
; -----------------------------------------
; 功能:把AX中的二进制无符号数转换成显式的十进制ASCII码,并送显示屏显示
; 入口:AX=二进制数
; 出口:在当前光标位置显示转换后的ASCII码数字
Dec_ASCII Proc Near
push dx
push bx
push di
mov bx,10
lea di,@@Temp_Save[6]
mov byte ptr [di],'$'
dec di
cld
@@Divide: xor dx,dx
div bx
or dl,30h
mov [di],dl
dec di
test ax,0ffffh
jnz @@Divide
inc di
push di
pop dx
mov ah,9
int 21h
pop di
pop bx
pop dx
ret
@@Temp_Save db 7 p(?)
Dec_ASCII EndP
; -----------------------------------------
; 功能:在N个字节数组中查找字符CHAR,并记录该字符出现的次数。
; 入口参数:
; si=一个N字节数的字符串TABLE首地址
; cx=字符串长度,N
; ah=要查找的字符
; 出口参数:bl=该字符出现的次数
Find_Chr Proc Near
@@Find_Chr: lodsb
cmp al,ah ;是指定的字符?
jnz $+4 ;不是
inc bl ;是,计数
loop Find_Chr ;判断下一个字符
ret
Find_Chr EndP
; -----------------------------------------
Prompt_Str db 'Please input a string: $' ;输入字符串提示信息
No_String db 'The string is null.$' ;空字符串提示信息
Prompt_Chr db 'Please input a charactor: $' ;输入字符提示信息
Prompt_CNT db 'The specified charactor in th string TABLE: $' ;指定字符出现次数提示信息
Start: push cs
pop ds
push cs
pop es ;使数据段、附加段与代码段同段
cld
Input_Str: Output Prompt_Str ;提示输入字符串
lea dx,TABLE ;字符串缓冲区地址
mov ah,0ah
int 21h
call Output_CTLF ;输出一个回车、换行
lea si,TABLE[1] ;实际输入的字符串长度地址
lodsb ;读入这个长度N
test al,0ffh ;N=0?
jnz Read_Chr ;否,转去输入一个字符
Output No_String ;空字符串提示信息
jmp Input_Str ;重新输入字符串
Read_Chr: Output Prompt_Chr ;提示输入字符
mov ah,1 ;从键盘输入一个字符
int 21h
cmp al,1bh
jz Exit_Proc ;若按键为Esc,则结束程序
cmp al,20h ;控制及通讯字符?
jb Read_Chr ;重新输入字符
call Output_CTLF ;输出一个回车、换行
call Output_CTLF ;输出一个回车、换行
push ax
Output Prompt_CNT ;提示指定字符出现次数提示
pop ax
mov ah,al ;指定的字符送ah保存
lea si,TABLE[1] ;实际输入的字符串长度地址
lodsb ;读入这个长度N
mov cl,al
xor ch,ch ;N=cx
xor bl,bl ;计数器,计数指定字符在字符串中出现的次数
call Find_Chr ;在N个字节数组中查找字符CHAR,并记录该字符出现的次数
mov al,bl
xor ah,ah
call Dec_ASCII ;把AX中的二进制无符号数转换成显式的十进制ASCII码,并送显示屏显示
Exit_Proc: mov ah,4ch ;结束程序
int 21h
TABLE db 255 ; 字符串缓冲区
Code ENDS
END Start ;编译到此结束