汇编使用C语言的参数
printf的参数从右向左push,最后再 call crt_printf 和 call crt_scanf;
调用伪指令 CALL
.686
.model flat, stdcall
.stack 4096
INCLUDE Irvine32.inc
INCLUDELIB Irvine32.lib
include F:\masm32\include\msvcrt.inc
includelib F:\masm32\lib\msvcrt.lib
.data
me_str db 'hello world! %x\n',0
me_input_int db '%d'
int32_val dd 123
ExitProcess proto,dwExitCode:dword
.code
main proc
push offset int32_val
push offset me_input_int
call crt_scanf;
push int32_val
push offset me_str
call crt_printf
invoke ExitProcess,0
main endp
end main
CF是无符号数溢出标志,OF是有符号数溢出标志
db定义字节类型变量,一个字节数据占1个字节单元,读完一个,偏移量加1 AL 8位
Define byte
dw定义字类型变量,一个字数据占2个字节单元,读完一个,偏移量加2 AX 16位
Define word
dd定义双字类型变量,一个双字数据占4个字节单元,读完一个,偏移量加4 EAX 32位 define dword
Dq 存放64位的双精度数据 8个字节 一般使用FPU寄存器来计算,但是也可以使用强制类型转换赋值给通用寄存器
使用
DD 最多存放2个WORD,4个字符 ,也就是Dword的大小,DD就是DWORD ,DOUBLE WORD
是伪指令的写法
两个字符为一个byte,
2个字节为DWORD,
也就是32位,4个BYTE
int32_val2 dd ‘1234’
定义dd ,目标内存为 倒序
int32_val2 dd ‘12345’ 报错,定义的字符串过大,超出32位的存放大小
0X 39 30
57 48
57=316+9
48=316
0X 3039 =3163+9*162+316 = 12345
通过小端对齐,把高字节的39放在内存高位,所以为
39 30
理论上,DD 类型的数据可以存放为2^32次方的数据
DW 16位 2个字节 1个WORD 初始值可能为 00 00 首先存放在低字节处,好歹大小也可以有2^16
0x:d2 4d
D:19922
实际存储为4DD2 还是小段对齐,优先放在低位 ,在存放到高位 的内存
12*16+7=199
7*16+11=123
00C7
007B
7B(0X) =7*16+11=123
MOV AH,7B
EAX:00EA 7B 01
AX AH AL
MOV AL ,7B
移动到AL 寄存器的位置
9*16+1=145
255+22 ==========&