鱼C论坛

 找回密码
 立即注册
楼主: wyuri

王爽汇编问题

[复制链接]
 楼主| 发表于 2017-4-6 14:20:24 | 显示全部楼层
wyuri 发表于 2017-4-6 14:11
还是 不行,都操作过了,感觉是我程序的问题,可我就是找不出来哪里的问题,可能是我能力有限找的费劲, ...

这个是王爽汇编13章实验3,下面的程序是书上的,但是在编译器里根本没法编译,一直报错,我该怎么改动。
还有13章里的13.1问题答案,感觉小甲鱼的答案有些问你,应该是8000h吧?但他写的是FFFFh

assume cs:code

code segment

  s1:  db 'Good,better,best,','$'

  s2:  db 'Never let it rest,','$'

  s3:  db 'Till good is better,','$'

  s4:  db 'And better,best.','$'

  s :  dw offset s1,offset s2,offset s3,offset s4

  row: db 2,4,6,8



start:  mov ax,cs

        mov ds,ax

        mov bx,offset s

        mov si,offset row

        mov cx,4

ok:     mov bh,0      

        mov dh,[si]     

        mov dl,0        

        mov ah,2        

        int 10h



        mov dx,[bx]   

        mov ah,9      

        int 21h

        inc si         

        add bx,2      

        loop ok



        mov ax,4c00h

        int 21h

code ends

end start
QQ截图20170406141622.png
QQ截图20170406141955.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-4-6 15:07:58 | 显示全部楼层
人造人 发表于 2017-4-4 15:04
程序没有问题,关掉DOSBox 重新开一下试试

问题解决了,是我的程序问题,之所以第二个结果没问题纯属巧合,问题在装长度的寄存器没有归零。呵呵呵呵,谢谢 辛苦了.
然后还有个问题,就是第十三章13.1问题,小甲鱼给的答案可能有问题,不应该是8000h么?但小甲鱼写的是ffffh。
还有第十三章实验题3,程序不能被编译器识别,应该怎么改可以正常运行
assume cs:code

code segment

  s1:  db 'Good,better,best,','$'

  s2:  db 'Never let it rest,','$'

  s3:  db 'Till good is better,','$'

  s4:  db 'And better,best.','$'

  s :  dw offset s1,offset s2,offset s3,offset s4

  row: db 2,4,6,8



start:  mov ax,cs

        mov ds,ax

        mov bx,offset s

        mov si,offset row

        mov cx,4

ok:     mov bh,0        ;第0页

        mov dh,[si]     ;dh中放行号

        mov dl,0        ;dl中放列号

        mov ah,2        ;置光标

        int 10h



        mov dx,[bx]     ;ds:dx指向字符串首地址

        mov ah,9        ;在光标位置显示字符

        int 21h

        inc si          ;行号递增

        add bx,2        ;指向下一字符串

        loop ok



        mov ax,4c00h

        int 21h

code ends

end start
QQ截图20170406141955.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-4-6 15:14:04 | 显示全部楼层
人造人 发表于 2017-4-4 15:04
程序没有问题,关掉DOSBox 重新开一下试试

OK了解决了,是我程序的问题,我没有把装长度的寄存器归零,^_^
还有个问题就是第十三章13.1问题,最大范围应该是8000h吧?但小甲鱼写的是ffffh。
还有第十三章实验3,程序没有办法通过编译器,我应该怎么更改能通过编译器
assume cs:code

code segment

  s1:  db 'Good,better,best,','$'

  s2:  db 'Never let it rest,','$'

  s3:  db 'Till good is better,','$'

  s4:  db 'And better,best.','$'

  s :  dw offset s1,offset s2,offset s3,offset s4

  row: db 2,4,6,8



start:  mov ax,cs

        mov ds,ax

        mov bx,offset s

        mov si,offset row

        mov cx,4

ok:     mov bh,0        ;第0页

        mov dh,[si]     ;dh中放行号

        mov dl,0        ;dl中放列号

        mov ah,2        ;置光标

        int 10h



        mov dx,[bx]     ;ds:dx指向字符串首地址

        mov ah,9        ;在光标位置显示字符

        int 21h

        inc si          ;行号递增

        add bx,2        ;指向下一字符串

        loop ok



        mov ax,4c00h

        int 21h

code ends

end start
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-4-6 16:57:01 | 显示全部楼层
去掉冒号
assume cs:code

code segment

  s1  db 'Good,better,best,','

  s2  db 'Never let it rest,','

  s3  db 'Till good is better,','

  s4  db 'And better,best.','

  s  dw offset s1,offset s2,offset s3,offset s4

  row db 2,4,6,8



start:  mov ax,cs

        mov ds,ax

        mov bx,offset s

        mov si,offset row

        mov cx,4

ok:     mov bh,0        ;第0页

        mov dh,[si]     ;dh中放行号

        mov dl,0        ;dl中放列号

        mov ah,2        ;置光标

        int 10h



        mov dx,[bx]     ;ds:dx指向字符串首地址

        mov ah,9        ;在光标位置显示字符

        int 21h

        inc si          ;行号递增

        add bx,2        ;指向下一字符串

        loop ok



        mov ax,4c00h

        int 21h

code ends

end start
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-4-8 20:00:50 | 显示全部楼层
人造人 发表于 2017-4-4 12:50
debug 可以修改位于堆栈上的单步中断标志

目前你可以这样理解,事实上不是这样的,你学到后面就会明白 ...

你好我有十五章的15.1检测点不懂
QQ图片20170408195459副本.jpg
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-4-8 20:31:05 | 显示全部楼层
wyuri 发表于 2017-4-8 20:00
你好我有十五章的15.1检测点不懂

当有程序执行 int 9
这条指令时,进入中断
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-4-10 10:03:05 | 显示全部楼层
人造人 发表于 2017-4-8 20:31
当有程序执行 int 9
这条指令时,进入中断

不太懂,怎么进去的,操作什么了就进int9了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-4-10 10:27:35 | 显示全部楼层
人造人 发表于 2017-4-8 20:31
当有程序执行 int 9
这条指令时,进入中断

什么时候进的中断历程,干什么了就进中断历程了,完全没看懂
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-4-10 10:31:54 | 显示全部楼层
人造人 发表于 2017-4-8 20:31
当有程序执行 int 9
这条指令时,进入中断

我想知道  是怎么判断进中断例程的,是因为  in al,60h这个指令,判断进中断例程的么?完全蒙如果这个不弄明白以后不都不知道怎么模仿int指令编程
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-4-10 10:37:48 | 显示全部楼层
人造人 发表于 2017-4-8 20:31
当有程序执行 int 9
这条指令时,进入中断

这题没问明白我都不敢问下两到题,怕把这题忘了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-4-10 11:28:33 | 显示全部楼层
人造人 发表于 2017-4-8 20:31
当有程序执行 int 9
这条指令时,进入中断

王爽汇编第十五章实在不明白读了好几遍书,就是搞不清楚
问题20.jpg
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-4-10 11:47:59 | 显示全部楼层
wyuri 发表于 2017-4-10 10:27
什么时候进的中断历程,干什么了就进中断历程了,完全没看懂

int 9 是键盘中断

当键盘上有按键按下的时候进入中断
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-4-10 11:56:43 | 显示全部楼层
wyuri 发表于 2017-4-10 11:28
王爽汇编第十五章实在不明白读了好几遍书,就是搞不清楚

in al, 60h
用in, out 指令直接读写端口
在这里,用in 指令从60h端口读一个字节到al寄存器
60h端口是 8042键盘控制器
端口地址范围                     分配说明
0x000-0x01f                       8237A DMA控制器1
0x020-0x03f                       8259A 可编程中断控制器1
0x040-0x05f                       8253/8254|A 定时计数器
0x060-0x06f                       8042键盘控制器
0x070-0x07f                       访问CMOS RAM/实时时钟RTC(Real Time Clock)端口
0x080-0x09f                       DMA页面寄存器访问端口
0x0a0-0x0bf                       8259 可编程中断控制器2
0x0c0-0x0df                       8237A DMA控制器2
0x0f0-0x0ff                         协处理器访问端口
0x170-0x177                       IDE硬盘控制器1
0x1f0-0x1f7                        IDE硬盘控制器2
0x278-ox27f                       并行打印机端口2
0x2f8-0x2ff                         串行控制器2
0x378-0x38f                       并行打印机端口1 
0x3b0-0x3bf                       单色MDA显示控制器
0x3c0-0x3cf                        彩色CGA显示控制器
0x3d0-0x3df                       彩色EGA/VGA显示控制器
0x3f0-0x3f7                        软盘控制器
0x3f8-0x3ff                        串行控制器1
000-00F 8237 DMA controller:

000 Channel 0 address register
001 Channel 0 word count
002 Channel 1 address register
003 Channel 1 word count
004 Channel 2 address register
005 Channel 2 word count
006 Channel 3 address register
007 Channel 3 word count
008 Status/command register
009 Request register
00A Mask register
00B Mode register
00C Clear MSB/LSB flip flop
00D Master clear temp register
00E Clear mask register
00F Multiple mask register

010-01F 8237 DMA Controller (PS2 model 60 & 80), reserved (AT)

020-02F 8259A Master Programmable Interrupt Controller:

020 8259 Command port (see 8259)
021 8259 Interrupt mask register (see 8259)

030-03F 8259A Slave Programmable Interrupt Controller (AT,PS2)

040-05F 8253 or 8254 Programmable Interval Timer:

040 8253 channel 0, counter divisor
041 8253 channel 1, RAM refresh counter
042 8253 channel 2, Cassette and speaker functions
043 8253 mode control (see 8253)
044 8254 PS/2 extended timer
047 8254 Channel 3 control byte

060-067 8255 Programmalbe Peripheral Interface (PC,XT,PCjr):

060 8255 Port A keyboard input/output buffer (output PCjr)
061 8255 Port B output
062 8255 Port C input
063 8255 Command/Mode control register

060-06f 8042 Keyboard Controller (AT,PS2):

060 8042 Keyboard input/output buffer register
061 8042 system control port (for compatability with 8255)
064 8042 Keyboard command/status register

070 CMOS RAM/RTC, also NMI enable/disable (AT,PS2, see RTC)
071 CMOS RAM data (AT,PS2)

080 Manufacturer checkpoint port
080-090 DMA Page Registers:

081 High order 4 bits of DMA channel 2 address
082 High order 4 bits of DMA channel 3 address
083 High order 4 bits of DMA channel 1 address

090-097 POS/Programmable Option Select (PS2):

090 Central arbitration control Port
091 Card selection feedback
092 System control and status register
094 System board enable/setup register
095 Reserved
096 Adapter enable/setup register
097 Reserved

0A0 NMI Mask Register (PC,XT) (write 80h to enable NMI, 00h disable)
0A0-0BF Second 8259 Programmalbe Interrupt Controller (AT,PS2):

0A0 Second 8259 Command port (see 8259)
0A1 Second 8259 Interrupt mask register (see 8259)

0C0 TI SN76496 Programmable Tone/Noise Generator (PCjr)
0C0-0DF 8237 DMA Controller 2 (AT):

0C2 DMA channel 3 selector (see ports 6 & 82)

0E0-0EF Reserved

0F0-0FF Math Coprocessor (AT,PS2)
0F0-0F5 PCjr Disk Controller:

0F0 Disk Controller
0F2 Disk Controller control port
0F4 Disk Controller status register
0F5 Disk Controller data port

0F8-0FF Reserved for future microprocessor extensions

100-10F POS Programmable Option Select (PS2):

100 POS Register 0, Adapter ID byte (LSB)
101 POS Register 1, Adapter ID byte (MSB)
102 POS Register 2, Option select data byte 1
        Bit 0 is card enable (CDEN)
103 POS Register 3, Option select data byte 2
104 POS Register 4, Option select data byte 3
105 POS Register 5, Option select data byte 4
        Bit 7 is (-CHCK)
        Bit 6 is reserved
106 POS Register 6, subaddress extension (LSB)
107 POS Register 7, subaddress extension (MSB)

110-1EF System I/O channel

170-17F Fixed disk 1 (AT):

170 disk 1 data
171 disk 1 error
172 disk 1 sector count
173 disk 1 sector number
174 disk 1 cylinder low
175 disk 1 cylinder high
176 disk 1 drive/head
177 disk 1 status

1F0-1FF Fixed disk 0 (AT):

1F0 disk 0 data
1F1 disk 0 error
1F2 disk 0 sector count
1F3 disk 0 sector number
1F4 disk 0 cylinder low
1F5 disk 0 cylinder high
1F6 disk 0 drive/head
1F7 disk 0 status

200-20F Game Adapter

210-217 Expansion Card Ports (XT):

210 Write: latch expansion bus data
    read: verify expansion bus data
211 Write: clear wait,test latch
    Read: MSB of data address
212 Read: LSB of data address
213 Write: 0=enable, 1=/disable expansion unit
214-215 Receiver Card Ports
214 write: latch data, read: data
215 read: MSB of address, next read: LSB of address

21F Reserved

220-26F Reserved for I/O channel

270-27F Third parallel port (see PARALLEL PORT):

278 data port
279 status port
27A control port

280-2AF Reserved for I/O channel

2A2-2A3 MSM58321RS clock

2B0-2DF Alternate EGA, or 3270 PC video (XT, AT)

2E0 Alternate EGA/VGA

E1 GPIB Adapter (AT)

2E2-2E3 Data acquisition adapter (AT)

2E8-2EF COM4 non PS2 UART (Reserved by IBM) (see UART)

2F0-2F7 Reserved

2F8-2FF COM2 Second Asynchronous Adapter
Primary Asynchronous Adapter for PCjr

300-31F Prototype Experimentation Card
Periscope hardware debugger

320-32F Hard Disk Controller (XT):

320 Read from/Write to controller
321 Read: Controller Status, Write: controller reset
322 Write: generate controller select pulse
323 Write: Pattern to DMA and interrupt mask register
324 disk attention/status

330-33F Reserved for XT/370

340-35F Reserved for I/O channel

360-36F PC Network

370-377 Floppy disk controller (except PCjr):

372 Diskette digital output
374 Diskette controller status
375 Diskette controller data
376 Diskette controller data
377 Diskette digital input

378-37F Second Parallel Printer (see PARALLEL PORT):

378 data port
379 status port
37A control port

380-38F Secondary Binary Synchronous Data Link Control (SDLC) adapter:

380 On board 8255 port A, internal/external sense
381 On board 8255 port B, external modem interface
382 On board 8255 port C, internal control and gating
383 On board 8255 mode register
384 On board 8253 channel square wave generator
385 On board 8253 channel 1 inactivity time-out
386 On board 8253 channel 2 inactivity time-out
387 On board 8253 mode register
388 On board 8273 read: status; Write: Command
389 On board 8273 write: parameter; read: response
38A On board 8273 transmit interrupt status
38B On board 8273 receiver interrupt status
38C On board 8273 data

390-39F Cluster Adapter

3A0-3AF Primary Binary Synchronous Data Link Control (SDLC) adapter:

3A0 On board 8255 port A, internal/external sense
3A1 On board 8255 port B, external modem interface
3A2 On board 8255 port C, internal control and gating
3A3 On board 8255 mode register
3A4 On board 8253 counter 0 unused
3A5 On board 8253 counter 1 inactivity time-outs
3A6 On board 8253 counter 2 inactivity time-outs
3A7 On board 8253 mode register
3A8 On board 8251 data
3A9 On board 8251 command/mode/status register

3B0-3BF Monochrome Display Adapter (write only, see 6845):

3B0 port address decodes to 3B4
3B1 port address decodes to 3B5
3B2 port address decodes to 3B4
3B3 port address decodes to 3B5
3B4 6845 index register, selects which register [0-11h]
    is to be accessed through port 3B5
3B5 6845 data register [0-11h] selected by port 3B4,
    registers 0C-0F may be read. If a read occurs without
    the adapter installed, FFh is returned. (see 6845)
3B6 port address decodes to 3B4
3B7 port address decodes to 3B5
3B8 6845 Mode control register
3B9 reserved for color select register on color adapter
3BA status register (read only)
3BB reserved for light pen strobe reset

3BC-3BF Primary Parallel Printer Adapter (see PARALLEL PORT):

3BC parallel 1, data port
3BD parallel 1, status port
3BE parallel 1, control port

3C0-3CF EGA/VGA:

3C0 VGA attribute and sequencer register
3C1 Other video attributes
3C2 EGA, VGA, CGA input status 0
3C3 Video subsystem enable
3C4 CGA, EGA, VGA sequencer index
3C5 CGA, EGA, VGA sequencer
3C6 VGA video DAC PEL mask
3C7 VGA video DAC state
3C8 VGA video DAC PEL address
3C9 VGA video DAC
3CA VGA graphics 2 position
3CC VGA graphics 1 position
3CD VGA feature control
3CE VGA graphics index
3CF Other VGA graphics

3D0-3DF Color Graphics Monitor Adapter (ports 3D0-3DB are write only, see 6845):

3D0 port address decodes to 3D4
3D1 port address decodes to 3D5
3D2 port address decodes to 3D4
3D3 port address decodes to 3D5
3D4 6845 index register, selects which register [0-11h]
    is to be accessed through port 3D5
3D5 6845 data register [0-11h] selected by port 3D4,
    registers 0C-0F may be read. If a read occurs without
    the adapter installed, FFh is returned. (see 6845)
3D6 port address decodes to 3D4
3D7 port address decodes to 3D5
3D8 6845 Mode control register (CGA, EGA, VGA, except PCjr)
3D9 color select palette register (CGA, EGA, VGA, see 6845)
3DA status register (read only, see 6845, PCjr VGA access)
3DB Clear light pen latch (any write)
3DC Preset Light pen latch
3DF CRT/CPU page register (PCjr only)

3E8-3EF COM3 non PS2 UART (Reserved by IBM) (see UART)

3F0-3F7 Floppy disk controller (except PCjr):

3F0 Diskette controller status A
3F1 Diskette controller status B
3F2 controller control port
3F4 controller status register
3F5 data register (write 1-9 byte command, see INT 13)
3F6 Diskette controller data
3F7 Diskette digital input

3F8-3FF COM1 Primary Asynchronous Adapter (see UART)3F0 Diskette controller status A:

3220-3227 PS2 COM3
3228-322F PS2 COM4
4220-4227 PS2 COM5
4228-422F PS2 COM6
5220-5227 PS2 COM7
5228-522F PS2 COM8
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-4-10 14:16:56 | 显示全部楼层
人造人 发表于 2017-3-27 13:39
第8行,没有问题

顺便说一下

这样我问您一个最主要的问题,然后我会了这个很多东西我就可以看结果自己去调试就省着没必要的总问您。
就是你是怎么让cmd显示程序的,我研究了好久不会弄,您能告诉我详细步骤么
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-4-10 14:37:38 | 显示全部楼层
人造人 发表于 2017-3-27 13:39
第8行,没有问题

顺便说一下

我的程序是这个样子的,我不知道怎么显示
QQ截图20170410143551.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-4-10 23:18:28 | 显示全部楼层
wyuri 发表于 2017-4-10 14:37
我的程序是这个样子的,我不知道怎么显示

装一个虚拟机,在xp下玩
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-4-11 11:34:20 | 显示全部楼层
人造人 发表于 2017-4-10 11:56
in al, 60h
用in, out 指令直接读写端口
在这里,用in 指令从60h端口读一个字节到al寄存器

王爽汇编第五章int9例程,push 和pop的顺序不样程序怎样正确运行,为什么就可以不设置if 和tf等于0完全不懂
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-4-11 11:40:56 | 显示全部楼层
wyuri 发表于 2017-4-11 11:34
王爽汇编第五章int9例程,push 和pop的顺序不样程序怎样正确运行,为什么就可以不设置if 和tf等于0完全不 ...

在进入中断后 if和tf 已经硬件置0了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-4-11 11:52:22 | 显示全部楼层
本帖最后由 wyuri 于 2017-4-11 11:54 编辑
人造人 发表于 2017-4-10 23:18
装一个虚拟机,在xp下玩


还有是先push 寄存器之后模拟的,然后又先pop寄存器后iret
push ax / push bx / push es /in al,60h/ pushf/call dword ptr ds:[0]/这是先寄存器入栈后cs ip入栈
pop es/pop bx/pop ax/iret/而又是先寄存器出栈后csip出栈
明显出栈顺序错误,我想知道程序怎么正确运行
这个问题我在上面有图片可能您没看到
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-4-11 12:27:04 | 显示全部楼层
人造人 发表于 2017-4-11 11:40
在进入中断后 if和tf 已经硬件置0了

你的意思是说只要我按键盘上的按键就产生中断了,然后就设置iftf为0 了是么?
书上是这样写的第十五章:键盘输入到达 60h 端口后,就会引发 9 号中断,CPU 则转去执行 int 9 中断例程。
书上还说第十三章:int 指令的格式为:int n, n为中断类型码, 它的功能是引发中断过程。
CPU 执行 int n 指令,相当于引发一个 n 号中断的中断过程,执行过程如下。
(1)  取中断类型码 n; (2) 标志寄存器入栈 , IF=0, TF=0;   (3)  CS , IP入栈; (4) (IP)=(n*4), (CS)=(n*4+2).
这是书上所写
那么先在我们是模拟 int 9 例程,按书上的说只有 int 9 的过程里有if tf为0,那为什么我们要把它却掉,硬生生的说已经设置为0了,怎么就设置了?

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-6-11 00:19

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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