首页
社区
课程
招聘
[求助]简单的汇编 帮忙看下
发表于: 2015-1-1 23:37 4338

[求助]简单的汇编 帮忙看下

2015-1-1 23:37
4338
jmp start
msg db 'L'
start:
        mov ax,cs
        mov ds,ax
        mov ax,0xb800
        mov es,ax
        mov al,[cs:msg]
        mov byte[es:0x00],al
        mov byte[es:0x01],0x07
end jmp end

为什么这里输出的不是L而是 f

[培训]科锐逆向工程师培训第53期2025年7月8日开班!

收藏
免费 0
支持
分享
最新回复 (7)
雪    币: 805
活跃值: (2718)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
程序的起始偏移是100H,也就是说,运行时,程序将被加载到 CS:0100 开始的内存,而非 CS:0000,必须在程序中对此进行申明,否则,就会出错。比如,在此例中,如果不加此申明,CS:msg 被编译为 CS:0002 ,这个位置属于 PSP,属于DOS系统区域,不是字符'L'的内存位置,加了说明后,CS:msg 被编译为 CS:0102,这个才是字符'L'正确的内存位置。

org 0x100
jmp start
msg db 'L'
start:
  mov ax,cs
  mov ds,ax
  mov ax,0xb800
  mov es,ax
  mov al,[cs:msg]
  mov byte[es:0x00],al
  mov byte[es:0x01],0x07
end jmp end
2015-1-2 14:12
0
雪    币: 88
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
不行啊,没有输出了
2015-1-2 17:15
0
雪    币: 403
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
[QUOTE=gpyahu;1341977]jmp start
msg db 'L'
start:
        mov ax,cs
        mov ds,ax
        mov ax,0xb800
        mov es,ax
        mov al,[cs:msg]
        mov byte[es:0x00],al
        mov byte[es:0x01],0x07
e...[/QUOTE]

mov ax,0xb800
  mov es,ax
  mov al,[cs:msg]
  mov byte[es:0x00],al  ;这句访问的是 地址0xb8000 超出0xb800的范围了
2015-1-2 17:51
0
雪    币: 88
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
[QUOTE=Tartar;1342107]mov ax,0xb800
  mov es,ax
  mov al,[cs:msg]
  mov byte[es:0x00],al  ;这句访问的是 地址0xb8000 超出0xb800的范围了[/QUOTE]
不是这么回事,问题我解决了,谢谢哈
2015-1-2 21:09
0
雪    币: 805
活跃值: (2718)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
    谁说没有输出,你希望得到什么样的输出?
上传的附件:
2015-1-2 23:59
0
雪    币: 88
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
我用的是nasm 16为的 生产com文件,你这是怎么弄出来的
2015-1-3 15:11
0
雪    币: 805
活跃值: (2718)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
      我也是用nasm编译的,程序开头加 org 0x100 本身就说明程序就是一个.com型的,你这个源程序的语法结构只能用nasm编译,用masm编译一定报错。只要把上面的源程序原样保存为xx.s,然后用命令 nasm  xx.s -o xx.exe 即可。
2015-1-3 15:36
0
游客
登录 | 注册 方可回帖
返回