关于masm6.14 16位和32位程序

zhushouqqq 2009-06-06 11:54:20
最近在看杨季文的书
第十章的第一个例子 我在masm6.14下编译不通过
有网友说 是我用masm的时候没有指定段是16位 还是32位
我想问的问题有
1 masm如果不加段说明 默认的是16位 还是32位
2 如果程序里有16位 和32位的代码(实模式到保护模式再到实模式) 那么如何使用连接器 才能正确连接呢 用什么版本的连接器
3 谁能介绍下关于masm中文的 资料 E文看不懂 - - !!

急 再线等60分钟
...全文
185 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhushouqqq 2009-06-09
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 cnzdgs 的回复:]
1 masm如果不加段说明 默认的是16位 还是32位
.model flat模式是32位,其它模式如果在.model之前指定指令集则默认32位,其余情况默认为16位。

2 如果程序里有16位 和32位的代码(实模式到保护模式再到实模式) 那么如何使用连接器 才能正确连接呢 用什么版本的连接器
用MASM附带的link.exe即可,没有特别的地方。

3 谁能介绍下关于masm中文的 资料 E文看不懂 - - !!
不锻炼永远看不懂。
[/Quote]

不是知道你说的link是什么版本
PE不能在在DOS下执行吧。
link3是 le格式的 link5是PE格式的
zhushouqqq 2009-06-09
  • 打赏
  • 举报
回复
额。。
问题已经解决了
用masm614编译 ml /c test.asm
然后 用link3连接的
因为dos程序是/omf格式
zhushouqqq 2009-06-06
  • 打赏
  • 举报
回复
无人问津?
cxdzxc 2009-06-06
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 cxdzxc 的回复:]
LGDT qword ptr cs:GDTR ;masm5.0在这里要用qword,因为MASM5.0有这个BUG,其它MASM6.XX要用fword
[/Quote]
mydo看看我在这里链接里15楼的回复吧http://topic.csdn.net/u/20090311/11/937a87ca-5599-466b-bc23-8f87f25228d5.html
大熊猫侯佩 2009-06-06
  • 打赏
  • 举报
回复
出错提示?
cxdzxc 2009-06-06
  • 打赏
  • 举报
回复
如果使用.386P伪定义的话,默认的编译方式是32位的,要正确编译混合代码模式中的16位段的程序,必须使用USE16编译伪指令,在后面的32位程序段重新使用USE32伪指令重新定义回32位编译方式,这里有以前发的一个帖子http://topic.csdn.net/u/20090311/11/937a87ca-5599-466b-bc23-8f87f25228d5.html,在14楼有一个这样的例子,但愿能对你有用了... ^_^
.386P
CSEG16 SEGMENT USE16
ASSUME CS:CSEG16
ORG 100H
START: cli
mov bx,offset cs:xianshixinxi_16
mov di,20*2
call xianshi_16

xor eax,eax
mov ax,cs
mov word ptr cs:seg_offset_16+2,ax
shl eax,4
xor ebx,ebx
mov bx,SEG CSEG_P32
SHL EBX,4
mov word ptr cs:cs_SEL32+2,bx
shr ebx,16
mov byte ptr cs:cs_SEL32+4,bl

xor ebx,ebx
mov bx,SEG CSEG_P16
SHL EBX,4
mov word ptr cs:cs_SEL16+2,bx
shr ebx,16
mov byte ptr cs:cs_SEL16+4,bl

xor edx,edx
mov dx,offset cs:gdt0
add eax,edx

mov dword ptr cs:GDTR+2,eax
LGDT qword ptr cs:GDTR

mov eax,cr0
or al,1
mov cr0,eax
db 0eah
seg_offset_16_P32: dw 0
dw offset cs_SEL32 - offset gdt0

xianshixinxi_16_dos_prog:
mov bx,offset cs:xianshixinxi_16_dos
mov di,80*2*3+20*2
call xianshi_16

return_dos:
mov ah,4ch
int 21h

xianshi_16:
mov ax,0b800h
mov es,ax
mov dh,0F4h
XIANSHI_16_1:
mov dl,cs:[bx]
cmp dl,0
je xianshi_over_16
mov word ptr es:[di],dx
add di,2
inc bx
jmp XIANSHI_16_1
xianshi_over_16: ret
;--------------------------------------------------------------------------------------------------------
gdt0: DQ 0
cs_SEL32: dw 0ffffh,0000,9a00h,00CFh
cs_SEL16: dw 0ffffh,0000,9a00h,0080h
DATA_SEL32: dw 0ffffh,0000,9200h,00CFh
GDTR: DW $-gdt0-1,0,0
;----------------------------------------------------------------------------------------
xianshixinxi_16 db "HELLO WORLD_DOS_16",0
xianshixinxi_16_dos db "RETURN DOS---QQ GROUP:83372198;QQ:750347821;http://biosos.5d6d.com/ NAME:CXDZXC Address:LANZHOU DATE:2009-3-15 ",0
;----------------------------------------------------------------------------------------
CSEG16 ENDS

;-------------------------------------------------------------------------------------------------------
CSEG_P32 SEGMENT USE32
assume CS:CSEG_P32
MOV dx,DATA_SEL32 - gdt0
MOV es,dx
mov edi,0b8000h+80*2*1+20*2
XOR EBX,EBX
mov Ebx,offset cs:xianshixinxi_P32
mov dh,0F4h
xianshi_P32:
mov dl,cs:[ebx]
cmp dl,0
je xianshi_over_P32
mov word ptr es:[edi],dx
add edi,2
inc ebx
jmp xianshi_P32
xianshi_over_P32:
db 0eah
SEL_offset_P32_P16: dw 0,0,offset cs_SEL16 - offset gdt0
;----------------------------------------------------------------------------------------
xianshixinxi_P32 db "HELLO WORLD_P32",0
;----------------------------------------------------------------------------------------
CSEG_P32 ENDS

;-------------------------------------------------------------------------------------------------------
CSEG_P16 SEGMENT USE16
assume CS:CSEG_P16
mov edi,0b8000h+80*2*2+20*2
XOR EBX,EBX
mov bx,offset cs:xianshixinxi_P16
mov dh,0F4h
xianshi_P16:
mov dl,cs:[ebx]
cmp dl,0
je xianshi_over_P16
mov word ptr es:[edi],dx
add edi,2
inc ebx
jmp xianshi_P16
xianshi_over_P16:
mov eax,cr0
AND al,0FEH
mov cr0,eax
db 0eah
seg_offset_16: dw offset xianshixinxi_16_dos_prog,0
;----------------------------------------------------------------------------------------
xianshixinxi_P16 db "HELLO WORLD_P16",0
;----------------------------------------------------------------------------------------
CSEG_P16 ENDS

END START
cnzdgs 2009-06-06
  • 打赏
  • 举报
回复
1 masm如果不加段说明 默认的是16位 还是32位
.model flat模式是32位,其它模式如果在.model之前指定指令集则默认32位,其余情况默认为16位。

2 如果程序里有16位 和32位的代码(实模式到保护模式再到实模式) 那么如何使用连接器 才能正确连接呢 用什么版本的连接器
用MASM附带的link.exe即可,没有特别的地方。

3 谁能介绍下关于masm中文的 资料 E文看不懂 - - !!
不锻炼永远看不懂。
BAYNPU 2009-06-06
  • 打赏
  • 举报
回复
把源代码贴出来看看吧。

21,459

社区成员

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

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