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块,嵌套对变量作用域也没有效果。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)