飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 3952|回复: 4

[C/C++] 16位汇编中的变量定义和乘除法

[复制链接]

该用户从未签到

发表于 2010-3-1 23:57:10 | 显示全部楼层 |阅读模式
随便写写测试的 ~

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

------------------------------------------------
PYG19周年生日快乐!
  • TA的每日心情

    2015-8-8 12:25
  • 签到天数: 1 天

    [LV.1]初来乍到

    发表于 2010-3-2 00:03:08 | 显示全部楼层
    /:018 占座学习下,谢谢N哥哥!
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    2022-4-18 15:36
  • 签到天数: 207 天

    [LV.7]常住居民III

    发表于 2010-3-31 19:56:50 | 显示全部楼层
    谢谢老大的精典文章。受教了!
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2010-5-28 04:39:37 | 显示全部楼层
    我怎么觉得汇编怎么那么难学啊~??
    N老大有没啥秘诀?
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2010-7-14 16:42:04 | 显示全部楼层
    回复 4# xiangdeanjing


        汇编的结构和C语言本质上没什么区别,只是汇编更具有针对性,更加的针对底层硬件应用!
        程序中的循环就是整个程序的骨架!
        子程序就是程序的功能部分!(头、手、脚。。。)!
        程序中的命令,mov add sub 等就是肉了!~
        分开理解就好学了!
        汇编还有一个重要内容就是寄存器的使用!汇编命令基本上都是针对不同寄存器的操作!
    PYG19周年生日快乐!
    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

    快速回复 返回顶部 返回列表