原本想把寄存器eax中的值以二进行形式输出,尝试着用asm进行编程,结果勉强凑出,但是由于是新手,水平太低,而且第一用asm编写,写得太乱了,请各位大牛指教更好的办法。
.486
.model flat, stdcall
option casemap:none
include d:\masmplus\include\windows.inc
include d:\masmplus\include\kernel32.inc
include d:\masmplus\include\user32.inc
includelib d:\masmplus\lib\user32.lib
includelib d:\masmplus\lib\kernel32.lib
.data
MsgText db "Hello world!",0
MsgTitle db "This is a messagebox",0
.data?
mg db 32 dup(?)
.code
start:
mov edx,offset mg ;把mg的地址指针存入edx
mov ebx,8h ;定义输入位数,输出8位
add edx,ebx ;把edx的指针往后面移8位,实际上只需要移7位,因此下一语句-1
sub edx,1 ;接上一语句,-1
mov eax,9bh ;实际要输出2进制的值放入eax,为16进制。
.while bx!=0 ;循环语句,8次
mov cl,al ;为避免eax被直接操作,故需放入cl中
and cl,1h ;末位取与,结果cl不是0就是1
add cl,30h ;加上30h转化为ascii中的字符0和1
mov [edx],cl ;把ascii字符移入edx值的地址
sub edx,1 ;edx值往前移
shr al, 1 ;算术右移一位
sub bx,1 ;循环减少1次
.endw
invoke MessageBox, NULL, addr mg, ADDR MsgTitle, MB_OK + MB_ICONINFORMATION
invoke ExitProcess, NULL
end start
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)