汇编语言中invoke函数 各参数的含义

作者&投稿:产冒 (若有异议请与网页底部的电邮联系)
汇编语言中,“@”,“#”,都有什么含义?~

#表示立即数寻址。采用立即寻址方式的指令,在立即数前面加上立即寻址符“#”。
例如指令MOV A,#30H中30H就是立即数,指令功能为将30H赋给累加器A。

@表示寄存器的间接寻址。
例如指令MOV A,@R0就使用了寄存器间接寻址方式,这条指令的意义为将地址指针R0指向的内部数据存储器单元中的数据送入累加器A中。假设R0中内容为30H,则此指令的功能是以R0寄存器的内容30H为地址,把内部RAM 30H单元中的内容传送给累加器A。

1、

assume cs:code, ss:stack
option casemap :none

stack segment
db 256 dup (?)
stack ends

trangle proto stdcall :WORD, :WORD

code segment
start:
mov ax, stack
mov ss, ax
mov sp, 256

invoke trangle, 7, '*'
invoke trangle, 7, '2'

mov ax, 4c00h
int 21h

trangle proc stdcall uses ax dx si di,
@rows :WORD, @symbol :WORD
xor di, di
mov ah, 2h
mov dl, byte ptr [@symbol]

xor di, di
.while di < @rows
xor si, si
.while si <= di
int 21h
inc si
.endw
inc di

mov dl, 13
int 21h
mov dl, 10
int 21h
mov dl, byte ptr [@symbol]
.endw
ret
trangle endp

code ends
end start



2、


assume cs:code, ds:datas, ss:stack
option casemap :none

NUMVARS equ 50

datas segment
var dd NUMVARS dup (?)
cnt dd 0
sum dd 0

ave dd 0
frc dd 0

hrd dd 100
flg dw 0
szErr db 'overflow',0
szNum db 'Enter the number of variables: ',0
szEnt db 'Enter these %_ numbers, use space or enter key as delimiter:', 13,10,0
szSum db 'Sum: %_',13,10,0
szAve db 'Average: %_.%_',13,10,0
szByd db 'Beyond average: ',0
szPhd db '%_ ',0
szTmn db 'Too many numbers',13,10,0
datas ends

stack segment
db 256 dup (?)
stack ends

input proto stdcall
iout proto stdcall :DWORD
print proto c :WORD, :VARARG

code segment
start:
mov ax, datas
mov ds, ax
mov ax, stack
mov ss, ax
mov sp, 256

invoke print, offset szNum
invoke input
mov word ptr [cnt], ax

cmp word ptr [cnt], NUMVARS
jg error_too_many

invoke print, offset szEnt, cnt
xor cx, cx
xor di, di

.while cx < word ptr [cnt]
invoke input
mov word ptr var[di], ax
mov word ptr var[di+2], dx
fild sum
fiadd var[di]
fistp sum
add di, 4
inc cx
.endw

finit
fild hrd
fild sum
fidiv cnt
fist ave

fimul hrd
fprem
fistp frc

invoke print, offset szSum, sum
invoke print, offset szAve, ave, frc

invoke print, offset szByd
xor di, di
xor cx, cx

finit
.while cx < word ptr [cnt]
fild var[di]
ficomp ave
fnstsw flg
mov ax, flg
sahf
jna @F
invoke print, offset szPhd, var[di]
@@:
add di, 4
inc cx
.endw
jmp done
error_too_many:
invoke print, offset szTmn
done:
mov ax, 4c00h
int 21h

;-------------------------------
; input proc
;-------------------------------
input proc near stdcall uses di
local @in_buf[12] :BYTE,
@in_num :DWORD,
@in_ten :WORD,
@in_tmp :WORD

mov word ptr [@in_num], 0
mov word ptr [@in_num+2], 0
mov @in_ten, 10
mov @in_tmp, 0

mov ah, 1h
xor di, di

.while 1
cmp di, 11
jge @in_error
int 21h
cmp al, 13
jz @in_newline
cmp al, ' '
jz @in_done0
mov @in_buf[di], al
inc di
.endw

@in_newline:
mov ah, 2h
mov dl, 13
int 21h
mov dl, 10
int 21h

@in_done0:
dec di

finit
fnstcw @in_tmp
or @in_tmp, 0c00h
fldcw @in_tmp
fld1


.while 1
cmp di, 0
jl @in_done1
xor ax, ax
mov al, @in_buf[di]
and al, 0Fh

mov @in_tmp, ax
fild @in_tmp
fmul st, st(1)
fiadd @in_num
fistp @in_num
fimul @in_ten
dec di
.endw

@in_error:
invoke print, offset szErr

@in_done1:
mov ax, word ptr [@in_num]
mov dx, word ptr [@in_num+2]

ret
input endp


;-------------------------------
; format output
;-------------------------------
print proc near c uses ax bx dx di si,
@szFmt :WORD, @args :VARARG
mov bx, @szFmt

xor di, di
mov si, 6
mov ah, 2h

.while byte ptr [bx+di] != 0
mov dx, [bx+di]
.if dx == 5f25h
invoke iout, [bp+si]
inc di
add si, 4
.else
int 21h
.endif

inc di
.endw
ret
print endp


;-------------------------------
; integer output
;-------------------------------
iout proc near stdcall uses ax dx di,
@arg :DWORD
local rmd :WORD, tmp :WORD, buf[16] :BYTE

finit
fnstcw tmp
or tmp, 0c00h
fldcw tmp

mov tmp, 10
fild word ptr [tmp]
xor di, di

.while word ptr [@arg] || word ptr [@arg+2]
fild @arg
fild @arg
fidiv tmp
fistp @arg
fprem
fistp word ptr [rmd]
mov dl, byte ptr [rmd]
or dl, 30h
mov buf[di], dl

inc di
.endw

dec di
mov ah, 2h

.if di & 8000h
mov dl, '0'
int 21h
.else
.while 1
cmp di, 0
.break .if sign?
mov dl, buf[di]
int 21h
dec di
.endw
.endif

ret
iout endp

code ends
end start



3、



assume cs:code, ss:stack, ds:datas
option casemap :none

datas segment
num1 dd ?
num2 dd ?
num3 dd 1
szErr db 'overflow',0
szNum db 'Enter num%_: ',0
szRes db '%_ + %_ = %_',0
datas ends

stack segment
db 256 dup (?)
stack ends

m2w macro dest
mov word ptr [dest], ax
mov word ptr [dest+2], dx
endm

input proto stdcall
iout proto stdcall :DWORD
print proto c :WORD, :VARARG

code segment
start:
mov ax, datas
mov ds, ax
mov ax, stack
mov ss, ax
mov sp, 256

invoke print, offset szNum, num3
invoke input
m2w num1

mov word ptr [num3], 2

invoke print, offset szNum, num3
invoke input
m2w num2

finit
fild num1
fiadd num2
fistp num3

invoke print, offset szRes, num1, num2, num3

mov ax, 4c00h
int 21h

;-------------------------------
; input proc
;-------------------------------
input proc near stdcall uses di
local @in_buf[12] :BYTE,
@in_num :DWORD,
@in_ten :WORD,
@in_tmp :WORD

mov word ptr [@in_num], 0
mov word ptr [@in_num+2], 0
mov @in_ten, 10
mov @in_tmp, 0

mov ah, 1h
xor di, di

.while 1
cmp di, 11
jge @in_error
int 21h
cmp al, 13
jz @in_newline
cmp al, ' '
jz @in_done0
mov @in_buf[di], al
inc di
.endw

@in_newline:
mov ah, 2h
mov dl, 13
int 21h
mov dl, 10
int 21h

@in_done0:
dec di

finit
fnstcw @in_tmp
or @in_tmp, 0c00h
fldcw @in_tmp
fld1


.while 1
cmp di, 0
jl @in_done1
xor ax, ax
mov al, @in_buf[di]
and al, 0Fh

mov @in_tmp, ax
fild @in_tmp
fmul st, st(1)
fiadd @in_num
fistp @in_num
fimul @in_ten
dec di
.endw

@in_error:
invoke print, offset szErr

@in_done1:
mov ax, word ptr [@in_num]
mov dx, word ptr [@in_num+2]

ret
input endp


;-------------------------------
; format output
;-------------------------------
print proc near c uses ax bx dx di si,
@szFmt :WORD, @args :VARARG
mov bx, @szFmt

xor di, di
mov si, 6
mov ah, 2h

.while byte ptr [bx+di] != 0
mov dx, [bx+di]
.if dx == 5f25h
invoke iout, [bp+si]
inc di
add si, 4
.else
int 21h
.endif

inc di
.endw
ret
print endp


;-------------------------------
; integer output
;-------------------------------
iout proc near stdcall uses ax dx di,
@arg :DWORD
local rmd :WORD, tmp :WORD, buf[16] :BYTE

finit
fnstcw tmp
or tmp, 0c00h
fldcw tmp

mov tmp, 10
fild word ptr [tmp]
xor di, di

.while word ptr [@arg] || word ptr [@arg+2]
fild @arg
fild @arg
fidiv tmp
fistp @arg
fprem
fistp word ptr [rmd]
mov dl, byte ptr [rmd]
or dl, 30h
mov buf[di], dl

inc di
.endw

dec di
mov ah, 2h

.if di & 8000h
mov dl, '0'
int 21h
.else
.while 1
cmp di, 0
.break .if sign?
mov dl, buf[di]
int 21h
dec di
.endw
.endif

ret
iout endp

code ends
end start

invoke 是函数调用的一伪指令,第一个是函数名字,后面是调用此函数的各个参数 ,
比如你的第一条 实际翻译出来就是
PUSH NULL
PUSH addr szBuffer
PUSH addr szCaption
PUSH MB_OK
CALL MessageBox

第一个参数表示的是父窗口,第二个是显示在消息框中的字符,第三个是标题中的字符,第四个是显示的按钮,这里显示一个确定按钮。
ExitProcess中参数表示退出进程的退出值。不过最好别用NULL,用0稍好。


java中invoke()的作用是什么?
就是调用类中的方法,最简单的用法是可以把方法参数化invoke(class, method)。比如你Test类里有一系列名字相似的方法setValue1、setValue2等等。可以把方法名存进数组v[],然后循环里invoke(test,v[i]),就顺序调用了全部setValue。Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了...

汇编语言中CALL可以用什么代替
汇编语言中CALL可以使用invoke伪指令代替;INVOKE 的语法如下: INVOKE expression [,arguments]expression 既可以是一个函数名也可以是一个函数指针。参数由逗号隔开。INVOKE是编译器支持的伪指令,会检查参数。CALL会直接去栈里取参, INVOKE最后也会变成 PUSH PUSH ... CALL 的形式。

invoke和trigger的区别
在语言中一般 Invoke是立即调用一段委托代码,相当于调用了一个函数。而trigger是触发一个事件,而事件机制允许注册多个事件。也即trigger所有绑定到该事件的监听器都会被触发。invoke,trigger两种思路了,如果只想简单的执行一个函数可以用invoke,如果是类似事件那种可能有多个函数被调用就用trigger。

汇编语言中invoke函数 各参数的含义
invoke 是函数调用的一伪指令,第一个是函数名字,后面是调用此函数的各个参数 ,比如你的第一条 实际翻译出来就是 PUSH NULL PUSH addr szBuffer PUSH addr szCaption PUSH MB_OK CALL MessageBox

java 中 invoke()的作用是什么?
Java语言作为静态面向对象编程语言的代表,极好地实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程。Java具有简单性、面向对象、分布式、健壮性、安全性、平台独立与可移植性、多线程、动态性等特点。Java可以编写桌面应用程序、Web应用程序、分布式系统和嵌入式系统应用程序等。

java 中 invoke()的作用是什么?
invoke(调用)就是调用Method类代表的方法。可以实现动态调用,例如可以动态的传人参数,可以把方法参数化。可以把方法参数化invoke(class, method),比如Test类里有一系列名字相似的方法setValue1、setValue2等等,可以把方法名存进数组v[],然后循环里invoke(test,v[i]),就顺序调用了全部setValue。此...

C#直接触发事件跟Invoke触发有什么不同
Invoke是委托的实例的方法,用Invoke来调用的是显式调用,不带Invoke的(即直接)调用是简化调用。在效率上用显式调用要比直接调用效率要高,我们知道微软力争语言的优美却忽略了性能。所以这个你懂的。

求大神翻译一下这段编程语言 。。! invoke-static {v2,v0} Lcom\/hu...
invoke-direct {v2,v0} Lcom\/huati\/ui\/Topic\/TopicDetailActivity;->a(Lcom\/huati\/api\/data\/c;)V这句也是函数调用没有返回值。goto :label_19无条件跳转到label_19处执行 switch_141:const-string v0 "赠送成功"switch分支值为141就执行 。最后是把后面的赠送成功字符串存入v0寄存器。

汇编语言中的proc伪指令和proto伪指令的区别?
子程序先声明后调用,用proc伪指令,先调用后声明用proto伪指令,proto就是告诉编译器,调用的子程序,定义这条指令的后边,书中写的很明白,你好像没望下看吧

如何在Windows和Linux上进行跨平台P\/Invoke
之所以做跨平台的P\/Invoke,是因为考虑到有些客户在Win32\/WinCE等系统中开发的.NET程序,需要换到Linux平台运行。嵌入式开发中,经常需要操作IO,.NET程序就通过P\/Invoke来调用一些用比如c\/c++一类语言开发的native代码完成IO操作。这时候针对windows编写的native代码,就不能不加修改的移植到Linux上,要...

安次区18117084435: WIN32汇编显示窗口的程序中INVOKE后边的N个参数是不是要按顺序写 -
浑股中宝: 必须要按顺序写,因为他本来为入栈操作,据我所知invoke 只会检查参数的个数,当程序运行时,会对参数进行值检查判断用户的动作

安次区18117084435: 汇编 invoke -
浑股中宝: GetModuleWindow是一个win32 api, invoke 就是调用它.

安次区18117084435: 汇编中SetWindowText 函数的第一个参数不能是eax吗 -
浑股中宝: 为 invoke 指令中如果你使用了 addr 即 取地址伪操作符 且 addr 的对象是个局部变量 的话 编译器会使用寄存器eax:mov ebx,@szString push eax 此时 eax 的值已被更改 你不能再用它作为此函数的 参数了 比如 这里 的窗口句柄 `~~~~ 解决方法;addr @szString" 会被翻译为:lea eax.比如 local @szString invoke SetWindowText,addr @szString 这里 &quot,eax

安次区18117084435: 汇编语言 call怎么用 -
浑股中宝: 汇编语言CALL是调用子程序指令,用法如下: CALL 子程序名 参数的传递是通过调用者和被调用者的相互约定实现的. 在51汇编语言中CALL只能实现2K范围内的调用,大于这个限制就需要用到LCALL了. 比如: ORG 0000H LJMP MAIN: ...

安次区18117084435: 在C#多线程中,很多帖子都提到了invoke 和beginInvoke函数
浑股中宝: 首先他们都是在线程中执行指定委托的.他们的参数都是delegate invoke在使用的时候你可以看做调用一个函数. begininvoke是在线程中异步执行委托.

安次区18117084435: Excel 函数解读,涉及row,offset函数 -
浑股中宝: ROW函数,返回一个引用的行号.如果省略 reference,则假定是对函数 ROW 单元格的引用.在Excel中,OFFSET函数的功能为以指定的引用为参照系,通过给定偏移量得到新的引用.返回的引用可以为一个单元格或单元格区域.并可以指定...

安次区18117084435: InvocationHandler中invoke方法中的第一个参数有什么用 -
浑股中宝: obj-从中调用基础方法的对象publicObjectinvoke(Objectobj,Object...args)throwsIllegalAccessException,IllegalArgumentException,InvocationTargetException;invoke方法:对带有指定参数的指定对象调用由此Method对象表示的基础方法.个别参数被自动解包,以便与基本形参相匹配,基本参数和引用参数都随需服从方法调用转换.

安次区18117084435: InvokeHelper函数的用法? -
浑股中宝: ActiveX 控件的方法和属性操作与生成的C++类成员函数相关联都是通过InvokeHelper函数的调用来完成的,InvokeHelper函数的第一个参数是 由Component Gallery(控件提供者)提供的.因为经过这样的处理,所以我们如果要调用ActiveX控件...

安次区18117084435: 急求用汇编语言编写一个键盘锁的程序 -
浑股中宝: 调用user32.dll中的BlockInput函数.该函数可锁鼠标键盘.BlockInput只有一个参数,1为锁定,0为解锁 在masn32中引入user32库,然后直接用【 invoke BlockInput 1 】就行了. .386 .model flat,stdcall option casemap:none include \masm32\...

安次区18117084435: 汇编语言是怎么调用c语言的程序的? -
浑股中宝: 一、 参数传递的基本规则(ATPCS(ARM—Thumb Procedure Call Standard)) 1、 参数传递二、汇编程序、C程序相互调用举例 1、 C程序调用汇编程序 汇编程序的设计要遵守ATPCS(ARM—Thumb Procedure Call Standard),保证程...

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