用汇编语言编写一个小程序(比如hello,word!)请懂的人帮忙提供源码

作者&投稿:杭屈 (若有异议请与网页底部的电邮联系)
如何用汇编语言写个小程序“HELLO WORD!”~

; Program Name: Hello.ASM

Hello SEGMENT ; 以“Hello”命名段
ASSUME CS:Hello,DS:Hello ;代码段和数据段在同一个段空间
ORG 100H ;指令从100H开始

Start: ;程序运行起始位置
MOV AX,3 ; 设置视频显示方式为文本显示,80x25,16色
INT 10H ; 调用视频中断
LEA DX,Prompt_Str ; 装入字符串地址
MOV AH,9 ; 控制台输出字符串
INT 21H ; dos功能调用

MOV AX,4C00H ; 结束程序
INT 21H ; dos功能调用

Prompt_Str DB 'Hello World!$' ; 要显示的字符串一定要以符号$作为结束符号

Hello ENDS ;段结束
END Start ;源程序代码结束

给它简单的加密一下就行了,例如把所有字符都加上1,在输出字符串前先把所有字符都减1.
data segment
szMsg db 'Ifmmp!Xpsme$'
...
code segment
...
lea si,szMsg
mov cx,11
decloop:
mov al, byte ptr[si]
dec al
mov byte ptr[si],al
inc si
loop decloop
输出...

您正在看的汇编语言是:hello,world!win32汇编小程序。

首先我们看一个“复杂”的Win32汇编程序
程序用来显示一个消息框
--------------------------------------------------
;文件名:3.asm

.386
.model flat ,stdcall

NULL equ 0
MB_OK equ 0

ExitProcess PROTO :Dword
MessageBoxA PROTO :DWORD,:DWORD,:DWORD,:Dword

includelib kernel32.lib
includelib user32.lib

.data
szText db "Hello, world!",0
szCaption db "Win32Asm",0

.code
start:
push MB_OK
lea eax,szCaption
push eax
lea eax,szText
push eax
push NULL
call messageboxa
xor eax,eax
push eax
call exitprocess
end start
--------------------------------------------------
编译链接:
分下面两步进行:
ml /c /coff 3.asm
link /subsystem:Windows /libpath:d:\masm7\lib 3.obj

第一步编译生成3.obj文件
/c 表示只编译,不链接
/coff 表示生成COFF格式的目标文件

第二步链接生成3.exe文件
/subsystem:windows 表示生成Windows文件
/libpath:d:\masm7\lib 表示引入库的路径为:d:\masm7\lib。
在安装Masm32后,引入库位于Masm32\Lib目录下。

也可设置环境变量Lib的值:在dos提示符下键入Set Lib=d:\masm7\lib,这样“链接”就可简单写成:
link /subsystem:Windows 3.obj,试想一下,在程序调试过程中,修改源程序是常用的事啦,每次编译链接都要带/libpath:...那该有多烦人呢。当然,我们也可在源程序中直接给出引入库的位置,这样,链接时就方便啦,如下:

includelib d:\masm7\lib\kernel32.lib
includelib d:\masm7\lib\user32.lib
--------------------------------------------------
执行:在dos提示符下键入3,回车,出现一个消息框,哈哈,真正的Win32程序!

--------------------------------------------------
深入分析:
看一下源程序,有这么两行:call messageboxa\call exitprocess。大家一看都知道,这是子程序调用,但是我们并没写这样的子程序,事实上,这些是API函数。作为函数,我们在调用时可能需要传送给函数一些参数,程序怎么知道传送的参数有哪些,类型是什么呢?就是通过函数原型定义,如下所示:
ExitProcess PROTO :Dword
MessageBoxA PROTO :DWORD,:DWORD,:DWORD,:Dword
可以看出,ExitProcess有一个参数,MessageBoxA有四个参数,这些参数都是Dword类型。

在Win32中,参数的传递都是通过堆栈来完成的。象MessageBoxA这个函数有四个参数,究竟是左边的先压入堆栈还是右边的先入栈呢?.model flat,stdcall给出了答案。stdcall 指定参数是从右到左压入堆栈的,且调整堆栈是在子程序返回时完成的。在源程序中不需要用“add sp,值”来保持堆栈平衡。对MessageBox,在API手册中是这样定义的:
int MessageBox(
HWND hWnd, // handle of owner window
LPCTSTR lpText, // address of text in message box
LPCTSTR lpCaption, // address of title of message box
UINT uType &n

您正在看的汇编语言是:hello,world!win32汇编小程序。
bsp; // style of message box
)
;所以会有我们的程序段:
push MB_OK
lea eax,szCaption
push eax
lea eax,szText
push eax
push NULL
call messageboxa

看看上面的程序,不难想到,假如在写程序时,少往堆栈里压入一个数据,那将是一个致命的错误。能不能将这种检查参数个数是否匹配的工作交给计算机来完成呢?这是可以的,INVOKE指令可以帮助我们完成这样的工作。假如你的参数个数不正确,连接器将给出错误提示。所以,极力建议你使用invoke代替call来调用子程序,当然,这不是绝对的。使用invoke上面的指令就可简写成下面的样子,看起来简炼多啦,查错也方便啦!
invoke messageboxa, NULL,addr szText,addr szCaption,MB_OK

另外,像NULL,MB_OK都是一些常量,这样的常量有很多,还有很多的结构,如果在我们的程序中一开始都写这么多的东西,可能一下子就把你吓怕啦,也容易出错,更不便于看程序的主要部分。hutch整理的Windows.inc包含了WIN32编程所需要的常量和结构体的定义,我们可简单的用一个include指令将这些常量和结构的定义插入到我们的文件中:
include d:\masm32\include\Windows.inc

但是Windows.inc中并不包含函数原型的声明,还要从其他的头文件中得到函数原型的声明,比如:messageboxa的原型声明在user32.inc文件中,exitprocess在kernel32.inc文件中。这些头文件都放在 \masm32\include文件夹下。

还有,要用Windows.inc,必须使用option casemap:none,它的意思是告诉 MASM 要区分符号的大小写,譬如:start和START是不一样的。否则,一个小小的程序,可能会出成百上千的错误呀!

其他的,就不再细说啦,到此,上面的程序可重新修改如下:
-----------------------------------------------------------------
;最终的结果
.386 ;表示要用到386指令
.model flat,stdcall ;32位程序,要用flat啦!;stadcall,标准调用
option casemap:none ;区别大小写

include Windows.inc ;包括常量及结构定义

include kernel32.inc ;函数原型声明
include user32.inc

includelib kernel32.lib ;用到的引入库
includelib user32.lib

.data;数据区,定义2个字符串
szText db "Hello, world!",0
szCaption db "Win32Asm",0

.code ;代码开始执行处
start:
invoke MessageBox,NULL,addr szText,addr szCaption,MB_OK

;调用MessageBoxAPI函数
invoke ExitProcess,NULL ;程序退出
end start;结束
------------------------------------
编译链接:
ml /c /coff /I d:\masm7\include 3.asm ;注意开关符识别大小写
link /subsystem:Windows /libpath:d:\masm7\lib 3.obj

/I d:\masm7\include 表示*.inc文件的位置,也可设置环境变量Set include=d:\masm7\include来简化操作,也可在程序中明确指出*.inc的位置。

前面讲的都是用两条指令来完成编译链接,实际上用一条指令也可完成,如下:
ml /coff /I d:\masm7\include 3.asm /link /subsystem:Windows /libpath:lib
若*.inc及引入库在源程序中都明确指出其位置,则可简化为:
ml /coff 3.asm /link /subsystem:

.386

.model flat,stdcall
option casemap:none
include kernel32.inc
lncludelib kernel32.lib
include windows.inc
.const
szHW db 'Hello World!'
.code
start:
invoke GetStdHandle,STD_OUTPUT_HANDLE
invoke WriteConsole,eax,offset szHW,12,offset szHW + 12,0
end start


用汇编语言编写一个小小程序
这个还不简单#include<stdio.h>void main(){ float a,b,c,s;\/*定义数据类型,数据初始化*\/s=(a*b+c)\/a;\/*计算并把计算结果赋值给s*\/printf("s=%f\\n",s);\/*输出计算结果*\/}

如何用汇编语言写个小程序“HELLO WORD!”
; Program Name: Hello.ASM Hello SEGMENT ; 以“Hello”命名段 ASSUME CS:Hello,DS:Hello ;代码段和数据段在同一个段空间 ORG 100H ;指令从100H开始 Start: ;程序运行起始位置 MOV AX,3 ; 设置视频显示方式为文本显示,80x25,16色 INT 10H ; 调用视频中断 LEA DX,Prompt_Str ; 装入字符串...

用汇编语言编写一个小程序(比如hello,word!)请懂的人帮忙提供源码_百度...
您正在看的汇编语言是:hello,world!win32汇编小程序。bsp; \/\/ style of message box );所以会有我们的程序段:push MB_OK lea eax,szCaption push eax lea eax,szText push eax push NULL call messageboxa 看看上面的程序,不难想到,假如在写程序时,少往堆栈里压入一个数据,那将是一个致...

用电脑的汇编语言(8086)编写移动的小车!
INC DI ;DI指向字符图形表中的第一个字符 MOV CHAR_CNT,CX ;保存循环次数 MOV POINTER,DI MOV LINE_ON,DH

汇编语言小程序求解
温度补偿,纸上谈兵而已,实际上就是忽悠人的,并没有实际的意义。只要把速度(340m\/s),估计正确了,温度,根本就不用管他。时间假定为400ms,这数字,应该是一个毫秒、一个毫秒(或微秒)累加出来的。你为什么要一个毫秒、一个毫秒的累加呢?你要是每隔三个毫秒,加一次一,结果,不就是 139m ...

汇编语言编写,题目很小,在线等,大虾们帮忙,急~~~ 从内存3000h到300ah...
; 冒泡排序子程序 ; N 为待排序的数据个数 ; TAB 中存放待排序的数据(无符号、字节型); 调用: call bsort ; 返回: 无返回值,TAB内数据被从小到大排序 ; 说明: ax,bx,cx,si,di 调用前的内容被破坏 N equ 100 bsort proc mov bx,offset TAB mov cx,N jcxz...

我初学汇编语言,有个小程序,希望大家帮帮忙!!我在线等!!!
c db 3 d db ?data ends code segment assume cs:code,ds:data start:mov ax,data mov ds,ax cmp a,0 jnz next1 cmp b,0 jnz next1 cmp c,0 jnz next1 mov al,a add al,b add al,c mov d,al jmp tj next1:mov a,0 mov b,0 mov c,0 tj:mov ah,4ch int 21h code ...

汇编语言小问题
MOV DX,96 ;AX=0FF60H,DX=96=60H XOR DH,0FFH ;AX=0FF60H,DX=0FF60H SBB AX,DX ;AX=0FF60H-0FF60H-1=0FFFFH SBB是带进位减法指令,目的操作数不仅要减去源操作数,还要减去一个进位标志。因为CF=1,故SBB AX,DX的结果为0FFFFH。

如何用汇编语言编写一个简单的小病毒代码
这简单啊 .386 .model flat,stdcall option casemap:none include windows.h include user32.h includelib user32.lib .code start:invoke ExitWindowsEx,EWX_SHUTDOWN,0 end start 你试试就知道了,根本关不了机。需要权限的。需要 SE_SHUTDOWN 权限的,要先提权。可以DeleteFile 删除C盘根目录下的...

汇编语言的一个小问题
8086中有个基址(bx,bp)+变址(si,di)的寻址方式。其中 [bx+bp]会出错,因为都是基址,[si+di]也会出错,因为都是变址。[bx+si]这样就不会有问题了

雨花台区18027446313: 用汇编语言编写一个程序 -
匡朗灭澳: 如下即可:DATAS SEGMENTTIPS DB 10, 13, 'Please input a number (1~8): $'CRLF DB 10, 13, 36 DATAS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATAS START:MOV AX, DATASMOV DS, AX LOP:LEA DX, TIPSMOV...

雨花台区18027446313: 用汇编语言编写一个小程序(比如hello,word!)请懂的人帮忙提供源码 -
匡朗灭澳: 您正在看的汇编语言是:hello,world!win32汇编小程序. 首先我们看一个“复杂”的Win32汇编程序 程序用来显示一个消息框 -------------------------------------------------- ;文件名:3.asm .386 .model flat ,stdcall NULL equ 0 MB_OK equ 0 ExitProcess ...

雨花台区18027446313: 用汇编语言写一小程序
匡朗灭澳: #include<iostream> using namespace std; void main() { int a[5],i; for(i=0;i<5;i++) { cin>>a[i]; } for(i=0;i<5;i++) cout<<a[i]; }

雨花台区18027446313: 如何用汇编语言写个小程序“HELLO WORD!” -
匡朗灭澳: ;堆栈段;----------------------------------------- stack segment stack db 100(?) stack ends;数据段;----------------------------------------- data segment szhello db 'hello,word',0dh,0ah,'$';----------------------------------------- data ends;-----------------------------------------...

雨花台区18027446313: 用汇编语言编写一个小程序 -
匡朗灭澳: 定义两个变量,都为int类型的! num1*num2就行了,问题是你有没有不同的软件就是了! 不同的语言系统输出或者控制台输出都是不一样的! JAVA中 import java.util.*; public static void main(string[] args) { int num1; int num2; Scanner input = new Scanner(System in); num1=input.nextInt(); num2=input.nextInt(); System.out.println("最后的成绩为!"+num1*num2); }

雨花台区18027446313: 用汇编语言编写一个简单程序 -
匡朗灭澳: 1.计算U=(X+(Y*Z-100))/W 其中:X,Y,Z,W均为十六位有符号数.程序如下: DATA SEGMENT X DW 10 ;16位变量 Y DW 20 Z DW 30 W DW 40U DW ?,?DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA ...

雨花台区18027446313: 汇编语言做的小程序 -
匡朗灭澳: 代码+注释承上.386.model flat,stdcall ;这里我们用stdcall 就是函数参数 压栈的时候从最后一个开始压,和被调用函数负责清栈 option casemap:none ;区分大小写 includelib msvcrt.lib ;这里是引入类库 相当于 #include<stdio.h>了 printf PROTO ...

雨花台区18027446313: 用汇编语言编写一个小程序,要求:用基础知识编写 -
匡朗灭澳: 啥小程序呢.1+....+100行否?mov cx,64h xor ax,ax rep add ax,cx ax持有和量

雨花台区18027446313: 用汇编语言设计一个简单程序 -
匡朗灭澳: dseg segment a db 2,7,9,3,1 c equ $-a dseg ends assume cs:cseg, ds:dseg cseg segment start: mov ax, dseg mov ds, ax mov cx, c xor bx, bx lea si, a m0: mov al, [si] cmp al, 5 jle m1 inc bx m1: inc si loop m0 mov ax, bx call print mov ax,4c00h int ...

雨花台区18027446313: 用汇编语言编写完成下列功能的小程序段. -
匡朗灭澳: 1、OR AL,00110000B 或者OR AL,0C0H 2、MOV AL,ES:[COUNT] MOV A...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网