汇编(三)

  本次程序实现的内容:从键盘读取一个1-7的数字,并显示相应的星期的英文单词。

  该程序使用地址表实现。用七个处理程序段分别显示1~7个 对应的英文单词,并将首地址保存在地址表中。

  地址表:在数据段中定义一个子存储区table,顺序存放7个处理程序段的起始地址。然后将输入的数字和对应的地址表下标对齐起来(即映射函数)即可。在这里需要注意的是,地址表中保存的分支地址是16位的,占用的是两个字节。所以在下标对应的时候,需要乘二。比如下标为i,则调用第i个处理程序段的入口地址是table[i*2]。乘二在汇编中可以用左移一位实现。

  具体如下:

  

;从键盘读取一个1-7的数字,并显示相应的星期的英文单词
stack segment stack
    db 2014 dup(?)
stack ends

data segment ‘data‘
    msg0 db 0dh,0ah,‘input number(1-7):‘,0dh,0ah,‘$‘
    msg1 db 0dh,0ah,‘Monday‘,0dh,0ah,‘$‘
    msg2 db 0dh,0ah,‘Tuesday‘,0dh,0ah,‘$‘
    msg3 db 0dh,0ah,‘Wednesday‘,0dh,0ah,‘$‘
    msg4 db 0dh,0ah,‘Thursday‘,0dh,0ah,‘$‘
    msg5 db 0dh,0ah,‘Friday‘,0dh,0ah,‘$‘
    msg6 db 0dh,0ah,‘Saturday‘,0dh,0ah,‘$‘
    msg7 db 0dh,0ah,‘Sunday‘,0dh,0ah,‘$‘
    tab dw PROCA,PROCB,PROCC,PROCD,PROCE,PROCF,PROCG  ;地址表
data ends

code segment ‘code‘
    assume cs:code,ds:data,ss:stack
start:
    mov ax,data
    mov ds,ax
    mov dx,offset msg0
    mov ah,09H
    int 21H
    mov ah,01H
    int 21H
    cmp al,31H
    jl start
    cmp al,37H
    jg start
    dec al
    sub al,30H
    cbw
    shl ax,1
    mov bx,ax
    jmp tab[bx]
PROCA:
    mov dx,offset msg1
    mov ah,09H
    int 21h
    jmp done
PROCB:
    mov dx,offset msg2
    mov ah,09H
    int 21h
    jmp done
PROCC:
    mov dx,offset msg3
    mov ah,09H
    int 21h
    jmp done
PROCD:
    mov dx,offset msg4
    mov ah,09H
    int 21h
    jmp done
PROCE:
    mov dx,offset msg5
    mov ah,09H
    int 21h
    jmp done
PROCF:
    mov dx,offset msg6
    mov ah,09H
    int 21h
    jmp done
PROCG:
    mov dx,offset msg7
    mov ah,09H
    int 21h
    jmp done
done:
    mov ax,4c00h
    int 21h
code    ends
    end start
时间: 2024-11-08 21:47:27

汇编(三)的相关文章

汇编三个数选最大

1 #include <stdio.h> 2 3 int main() 4 { 5 int i = 9; 6 int j = 67; 7 int k = 34; 8 int max = 0; 9 #if 0 10 11 if(i >= j) 12 max = i; 13 else 14 max = j; 15 if(k > max) 16 max = k; 17 exit: 18 #else 19 __asm__ __volatile__( 20 "mov r0, %1\

Samsung_tiny4412(笔记)--&gt;ASM with C,MMU,Exception,GIC

/**************************************************************************** * Samsung_tiny4412(笔记)-->ASM with C,MMU,Exception,GIC * * 声明: * 1. 以下所有的shell命令都是在root权限下运行的; * 2. 文中在需要往文件中写入内容的时候使用了如下2方式: * 1.如果文件不存在,创建文件;如果存在,以覆盖的方式往文件中添加内容: * cat >

C/C++中的预编译指令

工作中遇到的: 一个头文件中的: #pragma warning(disable:4996)#pragma warning(disable:4244)#pragma warning(disable:4267) 不理解意思,遂查? C/C++中的预编译指令 程序的编译过程可以分为预处理.编译.汇编三部分,其中预处理是首先执行的过程,预处理过程扫描程序源代码,对其进行初步的转换,产生新的源代码提供给编译器.预处理过程读入源代码之后,会检查代码里包含的预处理指令,完成诸如包含其他源文件.定义宏.根据条

预编译指令跨平台的作用

程序的编译过程可以分为预处理.编译.汇编三部分,其中预处理是首先执行的过程,预处理过程扫描程序源代码,对其进行初步的转换,产生新的源代码提供给编译器. 预处理过程读入源代码之后,会检查代码里包含的预处理指令,完成诸如包含其他源文件.定义宏.根据条件决定编译时是否包含某些代码的工作. 通过预编译指令,只会把满足条件的代码编译进来,其他代码不参与编译 1, 指令 预编译指令以 #开头,整条语句构成一条预编译指令 2, 作用 C/C++ 语言的预处理主要有三个方面的内容: 1.宏定义: 2.文件包含:

C语言-第15课 - 编译过程简介

第15课  - 编译过程简介 1. 编译器做了什么 (1)预编译: l 处理所有的注释,以空格代替. l 将所有的#define删除,并且展开所有的宏定义. l 处理条件编译指令#if,#ifdef,#elif,#else,#endif. l 处理#include,展开被包含的文件. l 保留编译器需要使用的#pragma指令. 预处理指令:gcc -E file.c -o hello.i (2)编译 l 对预处理的文件进行一系列的词法分析,语法分析和语义分析: 词法分析主要分析关键字,标示符,

跟我学汇编(三)寄存器和物理地址的形成

一.通用寄存器 对于一个汇编程序员来说,CPU中主要部件是寄存器.寄存器是CPU中程序员可以用指令读写的部件.程序员通过改变各种寄存器的内容来实现对CPU的控制. 不同的CPU,寄存器的个数.结构是不同的.8086CPU 有14个寄存器,每个寄存器有一个名称.这些寄存器是:AX.BX.CX.DX.SI.BP.IP.CS.SS.DS.ES.PSW.在今后的学习中我们用到这些寄存器时就对这些寄存器进行介绍. AX.BX.CX.DX四个寄存器可以存放一般性的数据,所以这四个寄存器称为通用寄存器.在80

汇编入门学习笔记 (三) —— 第一个程序

疯狂的暑假学习之  汇编入门学习笔记 (三)-- 第一个程序 参考:<汇编语言> 王爽  第四章 1.一个源程序从写到执行的过程 第一步:编写汇编源程序 第二步:对源程序进行编译连接 第三步:在操作系统中执行 2.源程序 代码: assume cs:first first segment start: mov ax,2 add ax,ax add ax,ax mov ax,4C00H int 21H first ends end start 代码解释: assume .segment.ends

王爽汇编实验(三)

王爽汇编浅显易懂,虽然前面两个实验都做完了,但是都是吊儿郎当做完的. 看到第三次实验比较好写心得,就写了. 原码如下,用提到的LINK.EXE和MASM.EXE进行编译链接操作. assume cs:codesgcodesg segmentmov ax,2000Hmov ss,axmov sp,0add sp,10pop axpop bxpush axpush bxpop axpop bx mov ax,4c00Hint 21Hcodesg endsend 首先是用debug 跟踪t1.exe执

汇编笔记三【寻址公式】

一.寻址方式一: 立即数寻址:[立即数] 例: 读取内存的值: MOV EAX,DWORD PTR DS:[0xFFFFFFFF] 向内存中写入数据: MOV DWORD PTR DS:[0xFFFFFFFF],eax 获取内存地址: LEA EAX,DWORD PTR:DS[0xFFFFFFFF] 二.寻址方式二: 寄存器寻址:[reg] reg代表寄存器,可以是8个寄存器中的任意一个 例: 读内存中的值: MOV EAX DWORD PTR DS:[ECX] 向内存中写入数据: MOV DW

linux平台学x86汇编(三):相关开发工具

[版权声明:尊重原创,转载请保留出处:blog.csdn.net/shallnet,文章仅供学习交流,请勿用于商业用途] 类似于其它高级语言,编写汇编语言,必须有一个开发环境,那么也就需要适当的工具了.搭建汇编语言至少应该有下面这些工具:汇编器.链接器.调试器.下下面看看在汇编语言开发环境中如何使用它们. 汇编器 汇编器用于把汇编语言源代码转换为处理器指令码.选择的汇编器必须能够生成所在系统的处理器系列指令码.汇编语言源代码程序有3个部分:操作码助记符.数据段.命令.但是每种汇编器对于每个部分使