- UID
- 2198
注册时间2005-6-29
阅读权限255
最后登录1970-1-1
副坛主
该用户从未签到
|
随便写写测试的 ~
1. 汇编与C中变量的联系
------------------------------------------------
assume cs:code,ds:data
data segment
nData dw ?
data ends
code segment
start:
mov nData,offset start
mov nData,55h
mov ax,offset nData;
mov ax,nData
mov word ptr [nData],123
mov nData,123
add nData,123
mov ax,4c00h
int 21h
code ends
end start
------------------------------------------------
C:\masm5>debug test.exe
-u
1412:0000 C70600000000 MOV WORD PTR [0000],0000
1412:0006 C70600005500 MOV WORD PTR [0000],0055
1412:000C B80000 MOV AX,0000
1412:000F A10000 MOV AX,[0000]
1412:0012 C70600007B00 MOV WORD PTR [0000],007B
1412:0018 C70600007B00 MOV WORD PTR [0000],007B
1412:001E 830600007B ADD WORD PTR [0000],+7B
------------------------------------------------
汇编中定义变量的格式:nData dw ?
C语言中定义变量格式: int nData
在汇编环境中,nData只有两种形态:
1. 对数据进行操作:word ptr [nData]
2. 取地址:offset nData(汇编指令中将算出地址的具体数值)
add nData,123 <==> nData+=123
mov ax,offset nData <==> mov ax,&nData
mov word ptr [nData],123 <==> mov word ptr [offset nData],xxx (该语法仅供演示)
word ptr [nData] <==> (int *)(offset nData)
byte ptr [nData] <==> (char*)(offset nData)
在汇编中用到 nData 和在C语言中用到 nData 是一个概念
nData 即代表一个变量名,也代表了该变量所对应的内存地址
2. 变量的定义和变量名的使用
------------------------------------------------
assume cs:code
data segment
nData dw 102 dup (?)
data ends
code segment
mov nData,ax // 这样编译是不OK的
jmp s
nData1 db 128 dup(0)
s:
mov ax,0
mov word ptr [nData],ax
code ends
end
------------------------------------------------
此时 即使 mov nData,ax 中有ax,也无法使编辑通过,因为数据格式转化不匹配
3. CALL 和 JMP 的一些总结
------------------------------------------------
assume cs:code,ds:data
data segment
nData dw ?
data ends
code segment
start:
call @@
call short @@
call far ptr @@
jmp @@
jmp short @@
jmp near ptr @@
mov nData,ax
jmp s
;nData db 128 dup(0)
s:
mov ax,0
mov word ptr [nData],ax
@@:ret
code ends
end start
------------------------------------------------
C:\masm5>debug tt.exe
-u
1412:0000 E81C00 CALL 001F
1412:0003 E81900 CALL 001F
1412:0006 9A1F001214 CALL 1412:001F
1412:000B EB12 JMP 001F
1412:000D 90 NOP
1412:000E EB0F JMP 001F
1412:0010 EB0D JMP 001F
1412:0012 90 NOP
1412:0013 A30000 MOV [0000],AX
1412:0016 EB01 JMP 0019
1412:0018 90 NOP
1412:0019 B80000 MOV AX,0000
1412:001C A30000 MOV [0000],AX
1412:001F C3 RET
------------------------------------------------
jmp short @@ // 不需要加 ptr
jmp near ptr @@
jmp far ptr @@
jmp 和 call 和相似
都是 直接直接对 IP 做加减
jmp 和 call 指令中 都可以无需添加 short near far ptr xxx 等修饰符 可以让编译器自己决定
4. DIV MUL 指令
------------------------------------------------
乘数 被乘数 乘积
乘法:mul 要么都为 8位(被乘数放AL中 乘数放内存或8位寄存器中) 放在AX中
要么都为16位(被乘数放AX中 乘数放内存或16位寄存器中) 放在 DX-AX中
除数的位数决定被除数的长度 商 余数(高位放余数)
除法:div 除数为8位时 被除数为16位 放 AX 中 AL AH
除数为16位时 被除数为32位 放DX-AX中 AX DX
------------------------------------------------ |
|