16位汇编中的变量定义和乘除法
随便写写测试的 ~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 ,123
mov nData,123
add nData,123
mov ax,4c00h
int 21h
code ends
end start
------------------------------------------------
C:\masm5>debug test.exe
-u
1412:0000 C70600000000MOV WORD PTR ,0000
1412:0006 C70600005500MOV WORD PTR ,0055
1412:000C B80000 MOV AX,0000
1412:000F A10000 MOV AX,
1412:0012 C70600007B00MOV WORD PTR ,007B
1412:0018 C70600007B00MOV WORD PTR ,007B
1412:001E 830600007B ADD WORD PTR ,+7B
------------------------------------------------
汇编中定义变量的格式:nData dw ?
C语言中定义变量格式: int nData
在汇编环境中,nData只有两种形态:
1. 对数据进行操作:word ptr
2. 取地址:offset nData(汇编指令中将算出地址的具体数值)
add nData,123 <==> nData+=123
mov ax,offset nData <==> mov ax,&nData
mov word ptr ,123 <==> mov word ptr ,xxx (该语法仅供演示)
word ptr <==> (int *)(offset nData)
byte ptr <==> (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 ,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 ,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 ,AX
1412:0016 EB01 JMP 0019
1412:0018 90 NOP
1412:0019 B80000 MOV AX,0000
1412:001C A30000 MOV ,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
------------------------------------------------ /:018 占座学习下,谢谢N哥哥! 谢谢老大的精典文章。受教了! 我怎么觉得汇编怎么那么难学啊~??
N老大有没啥秘诀? 回复 4# xiangdeanjing
汇编的结构和C语言本质上没什么区别,只是汇编更具有针对性,更加的针对底层硬件应用!
程序中的循环就是整个程序的骨架!
子程序就是程序的功能部分!(头、手、脚。。。)!
程序中的命令,mov add sub 等就是肉了!~
分开理解就好学了!
汇编还有一个重要内容就是寄存器的使用!汇编命令基本上都是针对不同寄存器的操作!
页:
[1]