大概有20多年不写汇编程序了,记得当时是在上大学是写过X86方面的汇编程序,参加计算机等级考试时,使用的就是汇编语言和C语言。突然那天碰到了一个汇编语言实现的任务,就简单的重温了一下汇编程序,主要对数据段,代码段和堆栈段的学习了解,各种不同寄存器的了解掌握,对学习计算机基础结构有帮助,供大家参考。具体如下:
1.X86汇编程序扩展名为.ASM。如果将ASM-->EXE,需要执行以下步骤。相当于.asm -> .obj -> .exe
2.可以通过DEBUG命令来检测调试和修改程序的执行情况和内存中的数据情况。
可参考:https://www.jb51.net/article/230016.htm
3.示例1:实现2的10次方计算和输出,会出现乱码,因为超出位数了。
assume cs:codesg
codesg segment
start:
mov ax,2
mov cx,9
s: add ax,ax
loop s
mov ax,4c00h
int 21h
codesg ends
end
4.示例2:实现计算结果(多位数)输出打印到控制台。
assume cs:codesg,ds:datasg,ss:stacksg
datasg SEGMENT ;定义数据段
num DB 0,0,0,0,0,0,0 ;定义一个数组num
datasg ENDS
stacksg SEGMENT STACK
DB 128 DUP(?)
stacksg ENDS
codesg segment
start:
;计算2的10次方,存放在ax中
mov ax,2
mov cx,10
s1:
add ax,ax
dec cx
loopnz s1 ;cx为 0 退出循环
;多位数输出打印到屏幕,目前计算结果在ax中找不到,待完善。
lea si,num ;把 si 赋值为数组的起始地址
mov bh,0
p1:
mov bl, 10
div bl ;这个数 除 10
push ax ; 把 ax 保存起来,防止被破坏
add ah,30h ;把计算的余数转化成ascii字符
mov num[si],ah;把余数 存到 num 数组
inc si ; 地址 ++
inc bh ; 计数器 ++
pop ax ;取出 ax ,并且把 ah 清空
mov ah ,0
cmp ax ,0 ;被除数为 0是 两者相等 , ZF 为 1
loopnz p1 ; cx为 0 ,或 ZF为 1 退出循环
mov cl,bh ;确定要输出的位数
mov ch,0
p2:
dec si
mov dl ,num[si] ;把数组中的每一个数 放到 dl 输出
mov ah ,2
int 21h
loop p2
mov ax,4c00h
int 21h
codesg ends
end
上述程序说明如下:
1)assume cs:codesg:表示将cs寄存器与codesg关联,将定义的codesg当作程序的代码段使用。同理,ds:datasg表示数据段定义关联,ss:stacksg表示堆栈定义关联。assume关键字表示假设。
2)codesg segment:表示代码段开始,名称为codesg;codesg ends表示代码段结束。
3)mov cx,10:在cx中要提前存放循环次数,因为(cx)影响着loopnz指令的执行结果
4)代码段的最后两条语句,实现的功能就是程序返回,这是 DOS 最伟大的机制,Windows 系统上是【消息机制】
mov ax,4c00h
int 21h
5)end:汇编程序的结束标记
5.示例2程序的流程图