以my.asm为例说明汇编语言上机过程.

以my.asm为例说明汇编语言上机过程.,第1张

汇编语言上机过程可以总结为以下几个步骤:

1.用编辑器编辑源程序,保存文件名为.asm;

2.用编译程序编译文件.asm,产生文件名为.obj的目标文件;

3.用连接程序将.obj文件连接生成.exe可执行文件;

4.用调试程序如debug载入.exe文件调试程序,看是否有逻辑错误。

这些步骤历茄都是在dos系统或者win系统下的肢颂察dos(通过运行cmd进入)中运行实现的,需要知道一些基本的dos命令。当然樱桥,现在有一些专为汇编语言初学者开发的集成开发环境软件,使用软件的时候编译连接调试简单方便。

程序中,对应DisplayHexDigit的子程序是:AL_ASCII,对应DisplayHexByte的子程序是:ByteD_ASCII。

本程茄没序通过编译,运行正确

Code Segment

Assume CS:Code,DS:Code

CR equ 000DH

LF equ 000AH

KBBack equ 0008H

-----------------------------------------

功能:显示指定地址(Str_Addr)的字符串

入口:

Str_Addr=字符串地址(要求在数据段)

用法: Output Str_Addr

用法举例:Output PromptStr

Output MACRO Str_Addr

lea dx,Str_Addr

mov ah,9

int 21h

EndM

-----------------------------------------

功能:显示输出一个字符

入口:dl=要显示的字符

Output_Chr proc Near

push ax

mov ah,02h

int 21h

pop ax

ret

Output_Chr endp

-----------------------------------------

功能:输出回车换行

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

-----------------------------------------

功能:取光标位置

入口:无

出口:DH=行号,DL=列号

GetCursor Proc Near

PUSH AX

PUSH BX

PUSH CX

XOR BX,BX

MOV AH,3

INT 10H

MOV Cursor_Row,DH

MOV Cursor_Col,DL

POP CX

POP BX

POP AX

RET

Cursor_Row DB ?

Cursor_Col DB ?

GetCursor EndP

--------------------------闹判---------------

功能:置光标位置

入口:Cursor_Row=行坐标Cursor_Col: 列坐标)

SetCursor Proc Near

PUSH CX

PUSH BX

PUSH AX

MOV DH,Cursor_Row

MOV DL,Cursor_Col

XOR BX,BX

MOV AH,2

INT 10H

POP AX

POP BX

POP CX

RET

SetCursor EndP

-----------------------------------------

功能:将AL中的低4位二进制数转换成十六进制显示的ASCII码

入口:AL

出口:AL=转换后的ASCII码

AL_ASCII Proc Near

cmp al,10 AL<10?

jb @@To_ASCII AL<10,按数字处颤弯纳理

add al,7 AL>=10,按大写字母处理

@@To_ASCII: add al,'0' 转换成相应的数字或大写字母

ret

AL_ASCII EndP

-----------------------------------------

功能:将AL中的字节数据转换成十六进制显示的ASCII码

入口:AL

出口:AX=转换后的ASCII码

Byte_ASCII Proc Near

push cx

mov cx,4

xor ah,ah 将AH置0

shl ax,cl 将AX左移4位

shr al,cl 将AL右移4位

xchg ah,al

call AL_ASCII 调用子程序,将AL中的值转换成相应的ASCII码

xchg ah,al

call AL_ASCII

xchg ah,al

pop cx

ret

Byte_ASCII EndP

-----------------------------------------

功能:将AL中的字节数据转换成十六进制显示的ASCII码,并在当前光标位置显示

入口:AL

出口:AX=转换后的ASCII码

ByteD_ASCII Proc Near

push dx

push ax

call Byte_ASCII 将AL中的字节数转换成十六进制显示的ASCII码

cmp al,'9'

jbe $+7

mov dl,'0'

call Output_Chr 显示一个字符

mov dl,al

call Output_Chr 显示一个字符

mov dl,ah

call Output_Chr 显示一个字符

mov dl,'H'

call Output_Chr 显示一个字符

pop ax

pop dx

ret

ByteD_ASCII EndP

-----------------------------------------

功能:键盘输入一个N位的十进制数字,将其转换成二进制数并保存在指定的内存单元。

入口:N=数字位数;di=保存输入的数字首地址

出口:转换后的二进制数保存在di所指的单元

Input_Digit Proc Near

push dx

push cx

push bx

push di

lea di,@@Save_Tmp

push di

cld

mov cx,N

push cx

@@Input: call GetCursor 取光标位置

mov ah,1 从键盘接受一个字符

int 21h

cmp al,CR 若键入的是回车,已经键入的数字不足N位

jz @@ASC_Dec 转去处理已经键入的数字

cmp al,KBBack

jz @@KB_Back 若是回空键,重新输入

cmp al,'0'

jb @@KBBack 若低于数字'0',重新输入

cmp al,'9'

ja @@KBBack 若低于数字'9',重新输入

jmp @@Save_Dig

@@KB_Back: dec Cursor_Col

inc cx

dec di

@@KBBack: call SetCursor 置光标位置

jmp @@Input

@@Save_Dig: and al,0fh 转换成二进制数

stosb 保存

loop @@Input 接受下一个数字

@@ASC_Dec: mov ax,cx

pop cx

pop si

sub cx,ax 实际输入的数字位数

xor bp,bp

xor dx,dx

xor ax,ax

jcxz @@Save_Ret 若直接回车,没有输入任何数字,按输入'0'处理

dec cx 实际输入的数字位数减1,准备把输入的这一串数字转换成二进制数

jcxz @@One_Digit 若输入的数字只有一位,转去直接保存这个二进制数

mov bx,10

@@Mul_Ten: lodsb

cbw

add ax,bp

mul bx

mov bp,ax

loop @@Mul_Ten

@@One_Digit:lodsb

cbw

add ax,bp

@@Save_Ret: pop di

stosb

pop bx

pop cx

pop dx

ret

@@Save_Tmp db 16 dup(?)

Input_Digit EndP

-----------------------------------------

N equ 3 输入数字的位数

Prompt_Str1 db 'Please input a number(0-15): $'

Prompt_Str2 db 'Please input a number(0-255): $'

Number db ? 保存输入的数据

Press_Key db 13,10,13,10,'Press any key to exit...$'

Start: push cs

pop ds

push cs

pop es

Output Prompt_Str1 提示输入数字

lea di,Number 数字保存地址

call Input_Digit 输入数字

call Output_CTLF 输出一个回车、换行

call Output_CTLF 输出一个回车、换行

mov al,Number

call AL_ASCII 将AL中的低4位二进制数转换成十六进制显示的ASCII码

mov dl,al

call Output_Chr 显示输出一个字符

Output Press_Key 提示按任意键继续

mov ah,1

int 21h

call Output_CTLF 输出一个回车、换行

call Output_CTLF 输出一个回车、换行

Output Prompt_Str2 提示输入数字

lea di,Number 数字保存地址

call Input_Digit 输入数字

call Output_CTLF 输出一个回车、换行

call Output_CTLF 输出一个回车、换行

mov al,Number

call ByteD_ASCII 将AL中的字节数据转换成十六进制显示的ASCII码,并在当前光标位置显示

Output Press_Key 提示按任意键继续

mov ah,1

int 21h

Exit_Proc: mov ah,4ch 结束程序

int 21h

Code ENDS

END Start 编译到此结束

ASM是C++中的一个关键字,用于在C++源码中内嵌汇编语言。ASM能写在任何C++合法语句中,目前asm还不是C的标准关键字,C11标准未加入正文,仅在Annex J中标记为“公共扩展”。

C++中的asm关键字用法。

__asm关键字启动内联汇编并且能写在任何C++合法语句此陆之处。它不能单独出现,必须接汇编指令、一组被大括号包含的指令或一对空括号和段。术语“__asm 块”在这里是任意一个指令或一组指令无论是否在括号内。

以下代码片段是在括号内的一个简单的__asm块。

_asm { mov al, 2  mov dx, 0xD007 out al, dx }

另一种方法是,你可以在每个汇编指令前放置__asm

__asm mov al, 2

__asm mov dx, 0xD007

__asm out al, dx

因为__asm关键字是一个语句分隔符,你也可以将汇编指令放在森棚顷同一行。

__asm mov al, 2 __asm mov dx, 0xD007 __asm out al, dx。

以上三个的例子产生相同的代码,但是第一种风格(把__asm块用括号括起来)有一些优势。括号可以清晰的将C或C++代码和汇编代码分开,并且避免了不必要的重复__asm关键字。括号也能避免模糊性。如果你想在__asm块的同一行放置一个C或C++语句,你必须将块用括号括起来。没有括号,编译器不能区分汇编代码在哪里停止以及C或C++代码在哪里开始。最后,因为在括号的文字有和原始MASM一样的格式,你能轻松的从一个已有的MASM源文件里剪切和黏贴文字到文件来。

不同于C和C++的括号,在Visual Studio中,包含__asm块的括号对变量的作用域并没有效果。你也能嵌套__asm块,嵌套对变量作用域也没有效果。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12424745.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-25
下一篇 2023-05-25

发表评论

登录后才能评论

评论列表(0条)

保存