前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Mac下写8086汇编

Mac下写8086汇编

作者头像
gojam
发布2019-05-14 16:18:59
2.4K0
发布2019-05-14 16:18:59
举报
文章被收录于专栏:gojam技术备忘录gojam技术备忘录
前期准备

我们课上讲的是8086下的16位汇编,如此远古的操作系统导致我在配置环境时遇到了很多问题。起初打算在win7虚拟机下用masm和汇编ide写汇编,但编译不成功,因为masm新版已经不是16位了。据查,masm5.0版本支持16位汇编,但又发现了DOSBox,与其在win7虚拟机下模拟DOS,不如直接在Mac中运行DOS环境。

DOSBox下载:https://www.dosbox.com/

masm5.0下载

代码语言:txt
复制
Step1、下载DosBox和masm5.0,将masm5.0放到用户文件夹内_(避免权限不够)_。

Step2、在DOSBox中键入"mount c ~/masm5.0",将masm5.0文件夹挂载为C盘。~代表当前用户目录,即/Users/xxx

Step3、在Mac中将写好的汇编源文件xx.asm放到masm5.0目录下,依次键入"masm xx.asm;"与"link xx.obj;",就可以直接运行程序了 masm负责将汇编源文件翻译成obj文件,link将obj文件链接成exe

图1

#用批处理来完成Step3

Mac下使用文本编辑工具(vscode也有masm插件支持汇编高亮)在masm5.0目录下新建一个xx.bat,把命令按行写进去就好了,如:

代码语言:javascript
复制
masm xx.asm;
link xx.obj;
xx.exe
编写第一个汇编程序

https://cloud.tencent.com/developer/article/1425682

如果你已经了解过指令系统寄存器,这些例子将向你介绍汇编源文件的基本结构:

代码语言:javascript
复制
data segment;定义数据段
  x db 'A'; define byte定义x为一个值为A的ASCII码的字节型变量
  y dw 30h; define word定义y为一个值为30h(48)的字型变量
  z dd 40h; define double word定义z为一个值为40h(64)的双字型变量
  a dw ?;定义一个变量
data ends;段结束的标记

stack1 segment para stack;不需要堆栈段可以不要这部分
  db 10h dup(0)
stack1 ends

code segment
assume cs:code,ds:data; assume伪指令用于确定段与段寄存器的关系,assume不会翻译成机器指令,但会存在于exe的文件头中,这会方便DOS重新分配内存时改变对应地址指针寄存器的值
start:mov ax,data;汇编后段名变成立即数,立即数不能直接赋值给段寄存器
  mov ds,ax;段寄存器将指向data数据段
  mov dl,x;显示字符前将字符移动到dl
  mov ah,02h;调用字符显示
  int 21h
  mov ah,4ch;4ch对应返回控制台子程序
  int 21h;根据ah确定子程序,自动跳转到子程序入口地址
 code ends
end start

#大小写转换

代码语言:javascript
复制
data segment;数据段
  errs db 'error!$'
data ends

stack1 segment para stack;堆栈段
  
stack1 ends

code segment;代码段
assume cs:code,ds:data
start:mov ax,data;程序起点
      mov ds,ax
input:mov ah,08h;控制台输入到al
      int 21h
      cmp al,'0';是否=0
      jz zero
      cmp al,'A';是否>=A,大于等于则cf=0,对应jnc
      jc err;<A且!=0的情况
      ;下面的情况>=A
      cmp al,5bh;是否<=Z,和Z的后一个字符比较,小于则cf=1,对应jc
      jc plus
      ;下面的情况>Z
      cmp al,'a'
      jc err
      cmp al,7bh
      jc minus
      jnc err
zero: mov dl,'0';移动到dl供显示
      mov ah,02h;字符显示
      int 21h
      mov ah,4ch;返回控制台
      int 21h
plus: add al,20h
      mov dl,al
      jmp show
minus: sub al,20h
       mov dl,al
       jmp show
show: mov ah,02h;字符显示
      int 21h
      loop input
err:  mov dx,offset errs;将errs首地址传送给dx
      mov ah,09h;召唤字符串
      int 21h;芝麻开门
      loop input

code ends;代码段结束
 end start

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018年12月11日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前期准备
  • 编写第一个汇编程序
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档