汇编程序学习回顾

大概有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程序的流程图

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一望无际的大草原

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值