问一下结构体的引用``

pop004dym 2011-05-27 07:55:44
我在数据段里定义结构体缓冲区没有出错程序运行正常。而在过程中定义却乱码了!我想问一下在过程中定义结构体缓冲区有什么不同之处和引用的时候有什么不同之处?为什么程序运行时会不正常
_DrawDot proc _hDC,_dwDegreeInc,_dwRadius;DrawDot,_hDC,360/12,3 ;画12个大圆点
local @dwNowDegree,@dwR
local @dwX,@dwY

local Polygon1:POINT ;这个是缓冲区
local Polygon2:POINT
local Polygon3:POINT
local Polygon4:POINT
local Polygon5:POINT
...全文
189 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
cnzdgs 2011-05-28
  • 打赏
  • 举报
回复
invoke Polygon,_hDC,addr Polygon1,5
你要使用的是POINT数组,应该以数组形式定义,你定义的5个变量不能当作数组使用。
local Polygons[5]:POINT
pop004dym 2011-05-27
  • 打赏
  • 举报
回复
invoke _CalcX,_dwDegree,@dwR
mov @dwX1,eax
invoke _CalcY,_dwDegree,@dwR
mov @dwY1,eax
add _dwDegree,180
invoke _CalcX,_dwDegree,10
mov @dwX2,eax
invoke _CalcY,_dwDegree,10
mov @dwY2,eax
invoke MoveToEx,_hDC,@dwX1,@dwY1,NULL
invoke LineTo,_hDC,@dwX2,@dwY2

ret

_DrawLine endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_ShowTime proc _hWnd,_hDC
local @stTime:SYSTEMTIME

pushad
invoke GetLocalTime,addr @stTime
invoke _CalcClockParam
;********************************************************************
; 画时钟圆周上的点
;********************************************************************
invoke GetStockObject,BLACK_BRUSH
invoke SelectObject,_hDC,eax
invoke _DrawDot,_hDC,360/12,6 ;画12个大圆点
invoke _DrawDot,_hDC,360/60,3 ;画60个小圆点
;********************************************************************
; 画时钟指针
;********************************************************************
invoke CreatePen,PS_SOLID,1,00
invoke SelectObject,_hDC,eax
invoke DeleteObject,eax
movzx eax,@stTime.wSecond
mov ecx,360/60
mul ecx ;秒针度数 = 秒 * 360/60
invoke _DrawLine,_hDC,eax,5
;********************************************************************
invoke CreatePen,PS_SOLID,2,0
invoke SelectObject,_hDC,eax
invoke DeleteObject,eax
movzx eax,@stTime.wMinute
mov ecx,360/60
mul ecx ;分针度数 = 分 * 360/60
invoke _DrawLine,_hDC,eax,20
;********************************************************************
invoke CreatePen,PS_SOLID,3,0
invoke SelectObject,_hDC,eax
invoke DeleteObject,eax
movzx eax,@stTime.wHour
.if eax >= 12
sub eax,12
.endif
mov ecx,360/12
mul ecx
movzx ecx,@stTime.wMinute
shr ecx,1
add eax,ecx
invoke _DrawLine,_hDC,eax,30
;********************************************************************
invoke GetStockObject,NULL_PEN
invoke SelectObject,_hDC,eax
invoke DeleteObject,eax
popad
ret

_ShowTime endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_ProcWinMain proc uses ebx edi esi hWnd,uMsg,wParam,lParam
local @stPS:PAINTSTRUCT

mov eax,uMsg
.if eax == WM_TIMER
invoke InvalidateRect,hWnd,NULL,TRUE
.elseif eax == WM_PAINT
invoke BeginPaint,hWnd,addr @stPS
invoke _ShowTime,hWnd,eax
invoke EndPaint,hWnd,addr @stPS
.elseif eax == WM_CREATE
invoke SetTimer,hWnd,ID_TIMER,1000,NULL
;********************************************************************
.elseif eax == WM_CLOSE
invoke KillTimer,hWnd,ID_TIMER
invoke DestroyWindow,hWinMain
invoke PostQuitMessage,NULL
;********************************************************************
.else
invoke DefWindowProc,hWnd,uMsg,wParam,lParam
ret
.endif
;********************************************************************
xor eax,eax
ret

_ProcWinMain endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_WinMain proc
local @stWndClass:WNDCLASSEX
local @stMsg:MSG

invoke GetModuleHandle,NULL
mov hInstance,eax
;********************************************************************
; 注册窗口类
;********************************************************************
invoke RtlZeroMemory,addr @stWndClass,sizeof @stWndClass
invoke LoadIcon,hInstance,ICO_MAIN
mov @stWndClass.hIcon,eax
mov @stWndClass.hIconSm,eax
invoke LoadCursor,0,IDC_ARROW
mov @stWndClass.hCursor,eax
push hInstance
pop @stWndClass.hInstance
mov @stWndClass.cbSize,sizeof WNDCLASSEX
mov @stWndClass.style,CS_HREDRAW or CS_VREDRAW
mov @stWndClass.lpfnWndProc,offset _ProcWinMain
mov @stWndClass.hbrBackground,COLOR_WINDOW + 1
mov @stWndClass.lpszClassName,offset szClassName
invoke RegisterClassEx,addr @stWndClass
;********************************************************************
; 建立并显示窗口
;********************************************************************
invoke CreateWindowEx,WS_EX_CLIENTEDGE,\
offset szClassName,offset szClassName,\
WS_OVERLAPPEDWINDOW,\
100,100,250,270,\
NULL,NULL,hInstance,NULL
mov hWinMain,eax
invoke ShowWindow,hWinMain,SW_SHOWNORMAL
invoke UpdateWindow,hWinMain
;********************************************************************
; 消息循环
;********************************************************************
.while TRUE
invoke GetMessage,addr @stMsg,NULL,0,0
.break .if eax == 0
invoke TranslateMessage,addr @stMsg
invoke DispatchMessage,addr @stMsg
.endw
ret

_WinMain endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
start:
call _WinMain
invoke ExitProcess,NULL
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
end start
pop004dym 2011-05-27
  • 打赏
  • 举报
回复
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 计算时钟圆周上某个角度对应的 X 坐标
; X = 圆心X + Sin(角度) * 半径
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_dwPara180 dw 180
_CalcX proc _dwDegree,_dwRadius
local @dwReturn

fild dwCenterX
fild _dwDegree
fldpi
fmul ;角度*Pi
fild _dwPara180
fdivp st(1),st ;角度*Pi/180
fsin ;Sin(角度*Pi/180)
fild _dwRadius
fmul ;半径*Sin(角度*Pi/180)
fadd ;X+半径*Sin(角度*Pi/180)
fistp @dwReturn
mov eax,@dwReturn
ret

_CalcX endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 计算时钟圆周上某个角度对应的 Y 坐标
; Y = 圆心Y - Cos(角度) * 半径
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_CalcY proc _dwDegree,_dwRadius
local @dwReturn

fild dwCenterY
fild _dwDegree
fldpi
fmul
fild _dwPara180
fdivp st(1),st
fcos
fild _dwRadius
fmul
fsubp st(1),st
fistp @dwReturn
mov eax,@dwReturn
ret

_CalcY endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 按照 _dwDegreeInc 的步进角度,画 _dwRadius 为半径的小圆点
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_DrawDot proc _hDC,_dwDegreeInc,_dwRadius ;画12个大圆点

;push esp
local @dwNowDegree,@dwR
local @dwX,@dwY
;local Polygon1 :POINT ;把这段的注释拿掉,数据段加上注释
;local Polygon2 :POINT
;local Polygon3 :POINT
;local Polygon4 :POINT
;local Polygon5 :POINT

mov @dwNowDegree,0
mov eax,dwRadius
sub eax,10
mov @dwR,eax
.while @dwNowDegree <= 360
finit
;********************************************************************
; 计算小圆点的圆心坐标
;********************************************************************
invoke _CalcX,@dwNowDegree,@dwR
mov @dwX,eax
invoke _CalcY,@dwNowDegree,@dwR
mov @dwY,eax

mov eax,@dwX ;画点
mov ebx,eax
mov Polygon4.x,ebx
mov ecx,@dwY
mov edx,ecx
mov Polygon1.y,ecx
mov Polygon2.y,ecx
sub eax,_dwRadius
mov Polygon1.x,eax
mov Polygon3.x,eax
add ebx,_dwRadius
mov Polygon2.x,ebx
mov Polygon5.x,ebx
add ecx,_dwRadius
mov Polygon3.y,ecx
mov Polygon5.y,ecx
sub edx,_dwRadius
mov Polygon4.y,edx
;sub eax,_dwRadius
;add ebx,_dwRadius
;sub ecx,_dwRadius
;add edx,_dwRadius
inVoke SetPolyFillMode,_hDC,ALTERNATE
invoke Polygon,_hDC,addr Polygon1,5
;invoke Ellipse,_hDC,eax,ecx,ebx,edx
;pop esp
mov eax,_dwDegreeInc
add @dwNowDegree,eax

.endw
ret

_DrawDot endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 画 _dwDegree 角度的线条,半径=时钟半径-参数_dwRadiusAdjust
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_DrawLine proc _hDC,_dwDegree,_dwRadiusAdjust
local @dwR
local @dwX1,@dwY1,@dwX2,@dwY2

mov eax,dwRadius
sub eax,_dwRadiusAdjust
mov @dwR,eax
;********************************************************************
; 计算线条两端的坐标
;********************************************************************
pop004dym 2011-05-27
  • 打赏
  • 举报
回复
;罗云斌Win32汇编 只要把缓冲区放在子程序中就不正确
.386
.model flat, stdcall
option casemap :none
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Include 文件定义
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
include windows.inc
include user32.inc
includelib user32.lib
include kernel32.inc
includelib kernel32.lib
include Gdi32.inc
includelib Gdi32.lib
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Equ 等值定义
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
ICO_MAIN equ 1000h
ID_TIMER equ 1
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 数据段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.data
;Polygon1 POINT <>
;Polygon2 POINT <>
; Polygon3 POINT <>
;Polygon4 POINT <>
;Polygon5 POINT <>
;local Polygon6:POINT

.data?

hInstance dd ?
hWinMain dd ?
dwCenterX dd ? ;圆心X
dwCenterY dd ? ;圆心Y
dwRadius dd ? ;半径
Polygon1 POINT <>
Polygon2 POINT <>
Polygon3 POINT <>
Polygon4 POINT <>
Polygon5 POINT <>

.const
szClassName db 'Clock',0
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 代码段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.code
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 计算时钟的位置、大小等参数
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_CalcClockParam proc
local @stRect:RECT

invoke GetClientRect,hWinMain,addr @stRect
mov eax,@stRect.right
sub eax,@stRect.left ;eax = 宽度
mov ecx,@stRect.bottom
sub ecx,@stRect.top ;ecx = 高度
;********************************************************************
; 比较客户区宽度和高度,以小的值作为时钟的直径
;********************************************************************
.if ecx > eax
mov edx,eax ;高度 > 宽度
sub ecx,eax
shr ecx,1
mov dwCenterX,0
mov dwCenterY,ecx
.else
mov edx,ecx
sub eax,ecx
shr eax,1
mov dwCenterX,eax
mov dwCenterY,0
.endif
shr edx,1
mov dwRadius,edx
add dwCenterX,edx
add dwCenterY,edx
ret

_CalcClockParam endp
cnzdgs 2011-05-27
  • 打赏
  • 举报
回复
结构体变量可以在栈中分配,没有问题。
pop004dym 2011-05-27
  • 打赏
  • 举报
回复
缓冲区为一系列的连续的POINT结构,是不是子程序堆栈中的内容不能作为结构体缓冲区?
实在是定义了缓冲区就使用用完就返回那个类型的。。要不是我等下发代码可以?
cnzdgs 2011-05-27
  • 打赏
  • 举报
回复
检查一下程序中是否存在内存越界或者使用错误的指针覆盖了这些变量中的数据。
pop004dym 2011-05-27
  • 打赏
  • 举报
回复
只有在定义这个缓冲区的子程序中用到这个缓冲区。局部变量和全局变量在引用上没什么格式的区别吧?我都是这样写的,把缓冲区定义成全局的就没错,改为局部的就有问题了
大熊猫侯佩 2011-05-27
  • 打赏
  • 举报
回复
你没有引用返回局部变量吧?
Areslee 2011-05-27
  • 打赏
  • 举报
回复
要不就是你动过堆栈桢结构了
pop004dym 2011-05-27
  • 打赏
  • 举报
回复
内部引用``不过调用和引用比较频繁
Areslee 2011-05-27
  • 打赏
  • 举报
回复
你多半是在函数外引用函数内的局部变量了

21,459

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧