当前位置:首页 > 我的音乐 > 正文内容

上次谈的64位的调用约定,然后谈谈UASM这汇编语言这一块。

Peirre1年前 (2023-10-27)我的音乐426

uasm是一个改编过的汇编语言,来自watcom的汇编语言,翻版过来的。很多新功能。是个教学语言。

那本《x64汇编语言:从新手到AVX专家》这本书有介绍下载的地方,整合了一个独立的编辑器,有编程的三种方式和语言。

内含新手汇编。nasm,,uasm,gnuas,fasm四种编译语言,有些没有被补充进来。

对与64位的汇编编程,这些汇编语言都可以实现。每一段时间都会有更新。可以手动升级。

另外,这些汇编编译器都有源代码,可以修补和更正,一般是指令上的增补和增加命令行参数。

uasm的前身是jasm,来源于watcom c这个程序包。32位的版本是免费的,有64位的版本并没有公开。

;--- Win32/64 console application, uses WinInc v2+.
;--- It can be used to generate both Win32 and Win64 binaries:
;--- 32bit:
;---  uwasm64 -coff -IInc WinXX_1.asm
;---  link /subsystem:console /Libpath:\WinInc\Lib WinXX_1.obj
;--- 64bit:
;---  uwasm64 -win64 -Zp8 -I\WinInc\Include WinXX_1.asm
;---  link /subsystem:console /Libpath:\WinInc\Lib64 WinXX_1.obj
; 注意: 在64位编译器中,当参数高于等于5个参数以后,那地址会有转换问题

if (type near) eq 0ff02h    ;no -win64 switch?
    .386
    .model flat, stdcall
    option casemap:none

FRAME equ <>
rax equ <eax>
rbx equ <ebx>
rcx equ <ecx>
rdx equ <edx>
rsp equ <esp>
rbp equ <ebp>
rsi equ <esi>
rdi equ <edi>

    .list
    .cref
else
	.X64
	.MODEL FLAT,FASTCALL
	option language:fastcall

    option win64:1  ;enable autosaving of register params to shadow space
    option frame:auto

    .nolist
    .nocref

endif    

WIN32_LEAN_AND_MEAN equ 1

    include windows.inc
    include kernel32.inc			; 从masm 中复制过来的汇编头
    include msvcrt.inc				; 从masm 中复制过来的汇编头
;    includelib <kernel32.lib>		; 这个用 golink 可以链接动态DLL链接库
 
lstrlen 		proto :dword
GetStdHandle 	proto :dword
WriteConsole 	proto :dword,:dword,:dword,:dword,:dword
ExitProcess 	proto :dword

;--- CStr(): 宏函数简单定义为一个字符串

;CStr macro Text:VARARG
;local szText
;    .const
;szText  db Text,0
;    .code
;    exitm <offset szText>
;endm


    .CODE
align 32

main proc FRAME uses r9 r8 rcx rdx rsi rdi 

	local dwWritten:DWORD	; 这个值没有为 NULL

    invoke GetStdHandle,STD_OUTPUT_HANDLE
    mov rbx,rax
    lea ecx, CStr("世界你好!",13,10)
    invoke lstrlen,ecx
    mov edi, eax
    invoke WriteConsole, ebx, esi, edi, addr dwWritten, 0  ; 转换为 addr 地址模式,第4-6个参数地址未识别

    ret

main endp

mainCRTStartup proc FRAME
	or rbx,rbx
    invoke main
    invoke ExitProcess, eax
mainCRTStartup endp

    END mainCRTStartup

说实在的,这个程序并没有错,是一个windows的程序64位实例。

说起来是参数问题。这个伪指令 invoke 是一个宏汇编。进入函数的方式不同,很多人会认为程序有问题,只是说,invoke并不适合64位编程。

当程序压入参数 addr dwWritten时,这里的指令在机器指令伪码中表示的是  lea ss:[dwWritten],dwWritten这个值是一个堆栈间接指针,没有赋值。

在这个函数中还有同步函数,所以这个值要填上才对。lea ss:[xxxxxx]正是传址的指令。所以识别在windows中有错误。ss是堆栈寄存器,使用其它段就没太多问题。

也就是uasm编译程序中,那个指令在64位中判断有问题。

1.png

这是调试软件跟踪的指令图,那个R9被 lea r9d,qword ptr ss[rbp-4],这个指令执行后,数值是一个堆栈数,那椎栈数在函数中是一个局部变量dwWritten。

实际上使用32位编程之后,程序运行是正常的。


分享给朋友:

相关文章

吉他弹唱的扫弦和指弹杂谈。

吉他弹唱的扫弦和指弹杂谈。

吉他分两大类,一类是民谣吉他,一类是古典吉他。民谣吉他是以和弦伴奏为主,辅以歌声。六根弦交错弹奏或者扫在琴弦上。古典吉他以独奏为主,单按和弦,以四,五,六,根弦为单弹。曲目音乐弹奏和弦改动加上指法,指...

好听简单的陶笛。

好听简单的陶笛。

陶笛不知道大家听说过没有。几年前买它的人很少,又几年陶笛卖疯了。陶笛的成本不是很高,它吹出来的声音浑厚,婉转动听。陶笛的代表作《故乡原风景》,曲子是他,陶笛始制作者也是他。陶笛的音乐有种旷野的优扬。声...

谈Beyond 的歌《喜欢你》

谈Beyond 的歌《喜欢你》

Beyond乐队作曲填词的一首歌,喜欢你,被很多歌手翻唱了很多遍。其中流行好听的歌手有Beyond,邓紫琪,还有个大学校园歌手。歌词大意:喜欢你 - G.E.M. 邓紫棋词:黄家驹曲:黄家驹细雨带风湿...

谈谈单音节奏型的歌。

谈谈单音节奏型的歌。

单音节就是4分音符的每个单元都是4个1分音符。这种类别的歌曲节奏感很强,主要突出歌曲的故事情节,营造捎紧和跳动的歌曲环境。这种类别的歌曲全世界都找得到,都是经典歌曲。是早期音乐基本曲调,十分有节奏和上...

温馨的谭泳麟,香港的温拿五虎之一。

温馨的谭泳麟,香港的温拿五虎之一。

谭泳麟他是金丽来唱片公司的老牌歌手。他的歌唱得好听,生活一直十分顺利,本来不是十分乐意提他。因为他有很多保留歌曲很多人喜欢,还有他的歌以前很普及。那时刚听到的粤语流行歌曲时,感觉上最好听的歌是“爱在深...

谈谈王杰和几分伤心几分痴。

谈谈王杰和几分伤心几分痴。

王杰是一个很不错的歌手,他一路走来很是辛苦。王杰属于流浪歌手,曾经四处奔波,而且四处都有女朋友。谈谈他做歌手以前:王杰是一个老实本分的青年,从学校出来后就喜欢一个女生,那女生后来被当地的混子抢走。说抢...